알고리즘 문제 풀이/Javascript

[node.js] 1331 나이트투어 with Python

맛대 2025. 1. 13. 18:43

https://www.acmicpc.net/problem/1331

구현

  • A,B,C로 표현되는 column 좌표를 아스키코드 변경을 이용
  • 6*6사이즈의 이중 배열을 통해 방문 체크
  • 절대값을 이용하여 나이트의 이동에 맞는지 확인
const solution = (size,array)=>{
    const transPosition = (alpha,number)=>{return [alpha.charCodeAt()-65,Number(number)-1]};
    const check = (r1,c1,r2,c2) => {
        const [gap1,gap2] = [Math.abs(r1-r2),Math.abs(c1-c2)]
        if (gap1>=3||gap2>=3||gap1+gap2 !== 3){return false};
        return true;
    };
    const visit = Array.from({length:6},()=> Array.from({length:6}).fill(0))
    let [br,bc] = transPosition(...array[size*size-1]);
    for (position of array){
        const [r,c] = transPosition(...position);
        if (visit[r][c]===1 || check(br,bc,r,c)===false) {return false};
        visit[r][c] = 1;
        [br,bc] = [r,c];
    }
    return true;
}

const fs = require('fs');
const URI = process.platform === 'linux'? 0:'./1331.txt';
const inputs = fs.readFileSync(URI,'utf-8').toString().trim().split('\n');
const size = 6
const ans = solution(size,inputs)
if (ans===true){console.log("Valid")}
else {console.log("Invalid")}

후기

  • python으로 먼저 문제를 푼 후, javascript를 이용하여 작성하는 형식으로 풀었다.
  • 최근에 javascript를 공부했기에 알고리즘 문제를 통해 익숙해지려고 오랜만에 node.js로 풀었다.
  • 그 전까지는 체계적이지 않았다는 것이 느껴졌다(함수를 표현식, 에로우 펑션을 혼용하거나 const [gap1,gap2] 대신 한줄씩 할당하는 등)
    • 코드 스타일을 정리해야겠다
  • 최초 python 코드는 아래 작성, 조금 불편하게 구현했다
import math
def solution(T:int,ls:list[str])->bool:
    def transPosition(position:str)->tuple[int]:
        return (ord(position[0])-65,int(position[1])-1)

    def check(r1:int,c1:int,r2:int,c2:int)->bool:
        if abs(r1-r2)>=3 or abs(c1-c2)>=3: return False
        gap = abs(r1-r2) + abs(c1-c2)
        if gap != 3: return False
        return True
    size = int(math.sqrt(T))
    visit = [[0] * size for _ in range(size)]
    sr,sc = transPosition(ls[0])
    br,bc = sr,sc
    visit[br][bc] = 1
    for i in range(1,T):
        position = ls[i]
        r,c = transPosition(position)
        if visit[r][c] or not check(br,bc,r,c): return False
        visit[r][c] = 1
        br,bc = r,c
    if not check(sr,sc,br,bc): return False
    return True

turn = 36
ls = [input() for _ in range(turn)]
ans = solution(turn,ls)
if ans:print("Valid")
else: print("Invalid")