코딩테스트

[프로그래머스] 게임 맵 최단거리_1844

라임온조 2023. 7. 19. 12:21

문제 및 코드

1. 생각

// 0: 벽, 1: 벽 아님
// 생각   
    // 시작점부터 시작해서 상하좌우를 살피면서 1이면 거기로 가고 0이면 안 가고
    // 근데 최단 경로로 가야 하니까 bfs
// 구현
    // 시작점을 bfs에 넣기
    // bfs
        // 시작점과 maps를 매개변수로 받기
        // bfs 위한 큐 생성
        // 시작점을 큐에 넣기
        // 큐가 비어있지 않을 때까지 반복
            // 큐에서 하나 빼고 방문했다고 표시하고 길이 1 증가
            // 큐에서 뺀 거 기준으로 상하좌우 돌기 위해 for문으로 4번 돌기
                // 시작점 기준 상하좌우가 maps 안에 있으면서 1이면 해당 위치를 큐에 넣기


초반에 생각했던 걸로 이 구현 틀은 틀렸다...

2. 회고

  • visited 배열의 행 열을 반대로 설정했었다... 곰곰이 생각해보니 답이 보이는데 그땐 왜 그랬는지
  • 큐에 int배열을 어떻게 넣어야 할지 고민하다 냅다 넣었더니 오류 났다. 미리 배열을 만들고 그 배열의 변수 이름을 넣어 주니 해결
  • 마지막 지점에 들렸을 때의 처리와 아예 마지막 지점에 가지 못한 경우 처리를 뒤늦게 깨달았다
  • 가장 중요한데 놓쳤던 부분은 맨 첫 지점부터의 거리를 구하는 것인데.. 내가 생각했던 방식은 answer라는 변수를 하나 설정해서 특정 위치에서 다음 위치로 이동할 수 있을 때마다 해당 answer를 1씩 증가한 다음 그 answer를 리턴하는 방식이었다. 그런데 계속 해도 틀려서 참고한 코드에서는 특정 위치에서 다음 위치로 이동할 수 있을 때마다 다음 위치에 처음부터 다음 위치까지의 거리를 구해 maps를 업데이트 하는 방식으로 구현하고 있었다.
  • 그런데 answer를 1씩 증가하는 방법으로도 풀 수 있긴 하다.... 추후 이 둘의 차이에 대해 알아봐야 할 듯. 
  • 그래도 예전엔 감을 못 잡았는데 이번엔 기본 틀은 구현해내서 나아진 것 같음

 

3. 기억

  • 큐에 int 배열 넣는 방법
Queue<int[]> q = new LinkedList<int[]>();
int[] arr = {1,2};
q.add(arr);

 

4. 체크

풀이 횟수 시간 정답 여부 참고 여부
2 1시간 30분   O