새소식

Programmers

[Programmers] 아이템 줍기 문제 - (javascript)

  • -
728x90
문제 이름 :  아이템 줍기

 

<<< 문제 내용 >>>

 

function solution(rectangle, characterX, characterY, itemX, itemY) {
    let answer = [];
    let board = Array.from(Array(101), () => new Array(101).fill(0));
    
    rectangle.forEach((el, i)=>{
        const yStart = el[1]*2;
        const yEnd = el[3]*2;
        const xStart = el[0]*2;
        const xEnd = el[2]*2;
        
        for(let y=yStart; y<=yEnd; y++){
            for(let x=xStart; x<=xEnd; x++){
                if(y===yStart || y===yEnd || x===xStart || x===xEnd){
                    if(board[y][x] === 1) continue;
                    else board[y][x] += 1
                }
                else board[y][x] = 2;
            }
        }
    });
    
    
    const dy = [-1,1,0,0];
    const dx = [0,0,-1,1];
    
    const bfs = (y, x, cnt) => {
        let queue = [[y, x, cnt]];
        let visited = Array.from(Array(101), () => new Array(101).fill(false));
        
        while(queue.length){
            [y, x, cnt] = queue.shift();
            visited[y][x] = true;
            
            if(y === itemY*2 && x === itemX*2) return cnt/2;
            
            for(let i=0; i<4 ;i++){
                let ny = y + dy[i];
                let nx = x + dx[i];
                
                if(ny<0||ny>=101||nx<0||nx>=101) continue;
                
                if(!visited[ny][nx] && board[ny][nx] === 1){
                    queue.push([ny, nx, cnt+1]);
                }
            }
        }
    }
    
    return bfs(characterY*2, characterX*2, 0);
}

* 굉장히 스트레스 받는 문제였다...

이 문제를 풀면서 어이가 없었기 때문에 평소와 다르게 오늘은 일기처럼 써볼까 한다.

 

처음엔 생각보다 빠르게 테두리를 다 그리고, 내부를 비우고 bfs로 찾아가면 되겠다는 결론을 세웠다.

 

뭔가 잘 될거 같다는 마음으로 코딩을 다 하고나서 확인했더니 엥? 테케 1, 5 번이 오류가 났다.

 

콘솔로 이동 방향을 찍어보니..

 

이때 4방향 탐색을하면서 아주 그냥 널뛰기를 해버린다.

 

이를 해결하기 위해, 각 꼭지점을 구분해놓고, 꼭지점에서 갑자기 똑같은 방향으로 질러가면

그 방향은 처리되지 않게 끔 하려고 했다.

 

근데 고민해보니, 첫 시작이 꼭지점일때 구현이 굉장히 어려웠다.

 

어떡하지 고민하다가 그림이 좌표여서 얻은 힌트인 "전체 도형을 2배로 늘리면 되겠다!" 라는 생각을 했다.

( 좌표 그림이 아니었다면 아마 못 떠올렸을 듯 )

 

내가 생각하고도 놀랬는데, 나중에 어떤 오류때문에 질문하기를 눌렀다가 이게 대표적인 해결법이라는 것도 깨달았다.

 

아무튼 정상적으로 작성 후, 테스트케이스가 전부 맞았다.

 

기쁜 마음으로 제출했는데 웬걸? 55점? 중간에 런타임에러를 보고 아~ 지도를 2배로 안키웠네 싶었다.

2배로 키우고.. 어? 또 55점이다.

 

진짜 한참을 끙끙거렸다. 다 2배로 잘 한거 같았고, 계속 코드를 보다가

bfs의 테두리 밖으로 나가는 예외처리를 50칸으로 두고 고치지 않았던 것이다.

 

결국 내 실수로 시간을 오래 쓴 징징 일기였다.. 어쨋든 풀어서 만족스럽긴 하다😀

 

 

 

 

도움이 되셨다면 공감 부탁드립니다.

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.