[Lv.2] 방문 길이 (JS)

hoheesu·2025년 6월 13일

알고리즘

목록 보기
2/5
post-thumbnail

분명히 한번 풀었던 문제인데 몇달만에 다시 풀려고 하니까 못푼 완젼 어려운 말 안되는 문제였다.

문제 : 방문 길이

📘 문제

게임 캐릭터를 4가지 명령어를 통해 움직이려 합니다. 명령어는 다음과 같습니다.

U: 위쪽으로 한 칸 가기
D: 아래쪽으로 한 칸 가기
R: 오른쪽으로 한 칸 가기
L: 왼쪽으로 한 칸 가기

캐릭터는 좌표평면의 (0, 0) 위치에서 시작합니다. 좌표평면의 경계는 왼쪽 위(-5, 5), 왼쪽 아래(-5, -5), 오른쪽 위(5, 5), 오른쪽 아래(5, -5)로 이루어져 있습니다.

제한사항

제한사항
dirs는 string형으로 주어지며, 'U', 'D', 'R', 'L' 이외에 문자는 주어지지 않습니다.
dirs의 길이는 500 이하의 자연수입니다.

💡 접근방식

  1. 이동 후 좌표(pos)를 반환하고, 이전 위치(temp)도 같이 반환
  2. 현재 위치와 이전 위치(temp)를 이어붙여서 경로를 기록
  3. A->B, B->A는 같은 경로로 간주하기 때문에 양방향을 모두 기록
  4. 중복 제거된 경로(Set 사용)
  5. loads에 양방향으로 두 번씩 기록했기 때문에 (loads.length - sLoads.size) / 2 를 빼줌

🔎 해결 코드

다시보니까 진짜 어떻게 풀었는지 신기하다. 누가봐도 알고리즘따위는 한번도 공부 안해본 FE개발자의 코드인것 같다

function solution(dirs) {
    let answer = 0;
    let position = [0, 0]
    let loads = []
    
    for( const dir of dirs ) {
        const calcDir = calcDirs(dir, position)
        if( !calcDir ) continue
        position = calcDir.pos
        const sPos = calcDir.pos.join(',')
        loads.push(sPos+calcDir.temp, calcDir.temp+sPos)
        answer ++
    }
    const sLoads = new Set(loads)
    return answer - (loads.length - sLoads.size) / 2
}

function calcDirs (dir, pos) {
    const temp = pos.join(',')
    if( dir === 'U' ) {
        if(pos[1] === 5) return null
        pos[1] += 1
    }
    if( dir === 'D' ) {
        if(pos[1] === -5) return null
        pos[1] -= 1
    }
    if( dir === 'L' ) {
        if(pos[0] === -5) return null
        pos[0] -= 1
        
    }
    if( dir === 'R' ) {
        if(pos[0] === 5) return null
        pos[0] += 1
    }
    return { pos, temp }
}
profile
🤔👏💡👨🏻‍💻🤯😇

3개의 댓글

comment-user-thumbnail
2025년 6월 15일

JS Master

1개의 답글