[Programmers] 방문 길이 - JavaScript

Joosi_Cool·2023년 3월 11일
0

Programmers

목록 보기
37/98
post-thumbnail

설계 과정

  • 10*10 칸 배열을 만들고, 그 배열에 간 방향을 입력해서 중복을 파악하려고 했다.
  1. 10 * 10칸 빈배열 만들기
  2. dirs를 쪼개고 아래와 같이 확인
    -> U,D,R,L 을 중에 좌표 밖으로 가지 않는다면
    -> 배열에 이 값이 있는지 체크
    -> 없다면 처음 간 길이므로 answer++
    -> 그 후에 location 변화


초기 코드

function solution(dirs) {
    var answer = 0;
    // 10 * 10칸 좌표에서 각각 어디 갔는지 방향을 담을 배열 생성
    var coord = new Array(11);
    for(var i = 0;i<10;i++){
        coord[i] = new Array(11).fill([]);
    }
    //첫 스타트는 정중앙
    var location = [5,5];

    //"ULURRDLLU"
    //dirs한개씩 배열로 쪼개기 -> U L U R R D L L U
    dirs = dirs.split("");
    dirs.forEach((element) => {
        if(element==='U'){
            if(location[1]<10){
                if(coord[location[0]][location[1]].indexOf('U')===-1){
                    coord[location[0]][location[1]].push('U');
                    answer++
                }
                location[1] +=1;
            }
 
        }
        else if(element ==='D'){
            if(location[1]>0){
                if(coord[location[0]][location[1]].indexOf('D')===-1){
                    coord[location[0]][location[1]].push('D');
                    answer++
                }
                location[1] -=1;
            }
        }
        else if(element ==='R'){
            if(location[0]<10){
                if(coord[location[0]][location[1]].indexOf('R')===-1){
                    coord[location[0]][location[1]].push('R');
                    answer++
                }
                location[0] +=1;
            }
        }
        else if(element ==='L'){
            if(location[0]>0){
                if(coord[loxcation[0]][location[1]].indexOf('L')===-1){
                    coord[location[0]][location[1]].push('L');
                    answer++
                }
                location[0] -=1;
            }
        }
    });    
    return answer;
}


결과

왜 틀렸을까... 콘솔을 찍어보자.

배열을 찍어보니 하나의 배열이 변하는게 아니라, 그 줄 전체가 push되었다.... 이 이유를 몰라, 다른 방식으로 해보려 한다.



개선 설계

우선 틀린 부분은 위에 부분 말고도 더 있었다. 양방향 문제이다. A->B, B->A로 가는 것이 같기 때문이다. 따라서 위에 설계한대로 잘 돌아갔어도 틀렸다. 이를 위해선 양방향 부분도 고려하는 설계가 필요하다.

  • Set함수 사용 -> 중복을 알아서 제거하기 위함
  1. dirs의 각각 값마다 아래를 수행
    만약 00-> 01 로 갔다면 => set.add(0001), set.add(0100)을 두개 추가하는 식으로 진행
  2. 추가하고 location변화
  3. 마지막에 양방향 부분을 고려하여 set의 길이를 2로 나누어 이를 리턴.


개선 코드

function solution(dirs) {
    //중복을 제거하기 위해, Set사용
    var set = new Set();
    var location = [0,0];
    dirs = dirs.split("");
    var plus;
    dirs.forEach((element)=>{
        // 00 -> 11 = 0011푸쉬
        if(element==='U'&&location[1]<5){
            plus = ""+location[0] + location[1] + location[0] + (location[1]+1);
            set.add(plus);
            plus = "" + location[0] + (location[1]+1)+location[0] + location[1];
            set.add(plus);
            location[1]++;
        }
        else if(element ==='D'&&location[1]>-5){
            plus = ""+location[0] + location[1] + location[0] + (location[1]-1);
            set.add(plus);
            plus = ""+ location[0] + (location[1]-1)+location[0] + location[1];
            set.add(plus);
            location[1]--;
        }
        else if(element ==='R'&&location[0]<5){
            plus = ""+location[0] + location[1] + (location[0]+1) + location[1];
            set.add(plus);
            plus = "" + (location[0]+1) + location[1]+location[0] + location[1];
            set.add(plus);
            location[0]++;
        }
        else if(element ==='L'&&location[0]>-5){
            plus = ""+location[0] + location[1] + (location[0]-1) + location[1];
            set.add(plus);
            plus = ""+ (location[0]-1) + location[1]+location[0] + location[1];
            set.add(plus);
            location[0]--;
        }
    })
    return set.size/2;
}

결과

profile
집돌이 FE개발자의 노트

0개의 댓글