몸과 마음이 건전한 SW 개발자

프로그래머스 [Lv. 2] 방문 길이 {언어 : JavaScript} 본문

알고리즘

프로그래머스 [Lv. 2] 방문 길이 {언어 : JavaScript}

스위태니 2024. 5. 7. 20:01

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/49994?language=javascript

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

정답 코드

function solution(dirs) {
    const visited = {};
    let [sr, sc] = [0, 0];
    
    const isValid = (r, c, dr, dc) => {
        const [nr, nc] = [r+dr, c+dc];
        return -5 <= nr && nr <= 5 && -5 <= nc && nc <= 5;
    };
    
    for (const d of dirs) {
        let [r, c] = [sr, sc];
        let isChanged = false;
        if (d == "U") {
            if (isValid(r, c, 1, 0)) {
                r += 1;
                isChanged = true;
            };
        } else if (d == "D") {
            if (isValid(r, c, -1, 0)) {
                r -= 1;
                isChanged = true;
            };
        } else if (d == "R") {
            if (isValid(r, c, 0, 1)) {
                c += 1;
                isChanged = true;
            };
        } else {
            if (isValid(r, c, 0, -1)) {
                c -= 1;
                isChanged = true;
            };
        };
        const newKey = String(sr) + String(sc) + String(r) + String(c);
        const prevKey = String(r) + String(c) + String(sr) + String(sc);
        // console.log(d, sr, sc, newKey);
        [sr, sc] = [r, c];
        if (isChanged) {
            visited[newKey] = 1;
            visited[prevKey] = 1;
        };
    };
    const answer = Object.keys(visited).length / 2;
    return answer;
}

풀이 방법

  1. 시작 지점 0, 0을 만든다.
  2. 범위를 벗어나지 않도록 isValid 함수를 만든다.
  3. 방문배열을 딕셔너리로 만들고 체크해준다.
    1. 여기서 주의할 점은 1,1에서 0,0으로 이동한 길과 0,0에서 1,1로 이동한 길은 같기 때문에 왕복으로 저장한다.
  4. answer를 딕셔너리의 키값으로 하는데 왕복 저장한 길을 2로 나눈다.

느낀점

  • 쉽지만 길에 대한 개념은 왕복의 개념이 포함되어 있다는 것을 잊지 말자.