[프로그래머스/JS] 아이템줍기

코린·2023년 5월 9일
0

알고리즘

목록 보기
14/44
post-thumbnail

문제

죄성해여.. 오늘은 문제가 넘 길어서링... 어차피 다들 문제 풀다 오신거니... 설명은 주워오지 않도록 하겠음미다!

문제풀이

참고블로그

일단 요 문제를 풀기위해서는 MAP을 그려줘야겠다~! 생각을 했습니다.
그래서 테두리 부분은 true, 안 부분은 false 이런식으로 해주어야겠다~~
싶었지만 생각해보니 우리는 테두리로만 탐색을 해야하기 때문에 테두리, 테두리 안, 테두리 밖 이렇게 3가지 경우로 구분해서 생각해주어야 합니다. 따라서 테두리는 1, 테두리 안 2, 테두리 밖은 0으로 설정해주었습니다.

테두리 인건 어케 아냐고요? rectangle 에서 점이 두 개가 주어지죠?

(x1,y1) (x2,y2)

x는 x1 혹은 x2 일때 , y는 y1 혹은 y2 일때 테두리겠죵??

그리고 여기서 원하는것은 바로바로바로바로~~~!!!
최단거리!!!
입니다.

고말인 즉슨 우리는 BFS 를 써줘야 한다는 것이져.. 후후후후후후후후후후후

아근데 제가 잘못했던 점이 바로 좌표에 *2를 안 해줬다는 겁니다.

그림에서 초록동그라미 부분 보시믄 사실 쟤네는 떨어져 있지만 내가 배열로써 저 친구를 찍게 되면 1 1 이렇게 붙어있답니다.
그래서 저걸 구분지어 주기 위해서 모든 좌표에 곱하기 2를 꼭꼭 해줘야 결과가 나옵니다.. 글고 물론 결과값을 낼때는 나누기 2를 해줘야겠죠잉???

(영~~ 모르겠는데요? 하시믄 참고블로그 가셔서 보세요! 아주 설명을 친절하고 기깔라게 해주셨답니다.)

코드

function solution(rectangle, characterX, characterY, itemX, itemY) {
    
   //좌표에 2곱해주기
    characterX *=2;
    characterY *=2;
    itemX*=2;
    itemY*=2;
    
    let doubleRec = rectangle.map(rec => rec.map (point => point*2));
    
    //이동좌표 설정해주기
    const dx=[0,0,-1,1];
    const dy=[-1,1,0,0];
    
    //map 그려주기
    
    let map = Array.from({length:103},() => Array(103).fill(0));

    
    doubleRec.forEach(([x1,y1,x2,y2])=>{
        
        for(let i=x1;i<=x2;i++){
            for(let j=y1;j<=y2;j++){
                if(i === x1 || i === x2 || j === y1 || j === y2){
                    if(map[i][j]===0){map[i][j]=1;}
                }
                else{map[i][j]=2;}
            }
        }
        
    });
    
    //큐를 생성하고 시작점을 설정해줍니다.
    let start=[characterX,characterY,0]; // 마지막은 카운트값
    let queue = [start];
    
    //시작점을 탐색하면 안되므로 0으로 설정해준다.
    map[characterX][characterY]=0;
    
    //BFS 탐색을 시작한다.
    while(queue.length > 0){
        
        let [x,y,cnt]=queue.shift();
        
        
        if(x === itemX && y === itemY){ return cnt/2; }
        
        for(let d=0;d<4;d++){
            let nx=x+dx[d];
            let ny=y+dy[d];
            if(map[nx][ny]===1){
                queue.push([nx,ny,cnt+1]);
                map[nx][ny]=0;
            }
        }
        
    }
    
    return 0;
}

잡담

요 부분을 고려하지 못하고 true, false로 테두리를 구분지으려 했었던것이 계속 틀리던...문제의 경우였다!!!!!!!!!!!
그래서 직접 map을 다 찍어보고 나서야... 아 테두리, 안, 밖 다 구분해줘야 되는구나..하구 알았다...
그래서 앞으로는 예외에 대한 부분을 좀 더 냉!철!하고 꼼!꼼!하게 보도록 해야겠다~~~

profile
안녕하세요 코린입니다!

0개의 댓글