본문 바로가기

프로그래머스/구현

[구현] 프로그래머스 '방문 길이' - js

반응형

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/49994#qna

 

프로그래머스

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

programmers.co.kr

2. 코드

처음 푼 코드)

6번 테케부터 틀린 코드.. 어디가 잘못된걸까? 모르겠다. 반대 방향으로 접근한 것까지 전부 포함시켜줬는데...

function solution(dirs) {
    let answer = 0;
    let cur = [0,0]; // 현재 좌표
    let way = [[[0,0],[0,0]]]; // 지금까지 다녔던 길 저장
    
    for(let i=0;i<dirs.length;i++){
        let temp = [...cur];
        if(dirs[i] === "U" && cur[1] < 5) cur[1] += 1;
        else if(dirs[i] === "D" && cur[1] > -5) cur[1] -= 1;
        else if(dirs[i] === "R" && cur[0] < 5) cur[0] += 1;
        else if(dirs[i] === "L" && cur[0] > -5) cur[0] -= 1;
        
        if(way.filter(el => (el[0][0] === temp[0] && el[0][1] === temp[1] 
            && el[1][0] === cur[0] && el[1][1] === cur[1]) && 
            (el[0][0] === cur[0] && el[0][1] === cur[1] 
            && el[1][0] === temp[0] && el[1][1] === temp[1])).length === 0) {
            answer++;
            way.push([temp,cur]);
        }
        
    }
    
    return answer;
}

정답)

정답은 Set을 사용하는 방법이였다. 방문 좌표를 문자열 식으로 저장한 후 Set을 사용하여 겹치는 요소가 없게끔하기! 너무 좋은 풀이다.. 나도 언제쯤 이런 풀이를^^7 구현 문제 잘풀고싶다~

function solution(dirs) {
    let move = { L: [-1, 0], R: [1, 0], U: [0, 1], D: [0, -1] };
    let now = [0, 0];
    let route = new Set();
    
    for (let dir of dirs) {
        let nowX = now[0] + move[dir][0];
        let nowY = now[1] + move[dir][1];
        
        if (nowX > 5 || nowX < -5 || nowY > 5 || nowY < -5) continue;
        
        route.add("" + now[0] + now[1] + nowX + nowY);
        route.add("" + nowX + nowY + now[0] + now[1]);
        
        now = [nowX, nowY];
    }
    
    // 위에서 정방향, 반대 방향 두번 add하므로 /2 해야함 -> 중요!
    return route.size / 2;
}

 

복기

6/5
반응형