[BOJ2206] 벽 부수고 이동하기

Updated:

문제

  • NxM 행렬 0이동 1벽
  • (1,1) —> (N,M) 최단경로
  • 벽 하나만 부술 수 있음

입력

  • 첫째 줄 N, M (1<= <= 1,000)
  • 다음 N줄 M개의 숫자로 맵 주어짐

출력

  • 최단거리 출력, 불가능시 -1

설계

  • 최단거리를 구하는 문제이기 때문에 BFS 적용
  • visit 변수를 단순 2중배열로 처리하는 것이 아니라, 3중 배열사용
  • visit 3번째 배열은 벽을 부순 경우와 안 부순 경우의 두 가지 상황에 대한 처리 하기 위함. 그래서 크기는 2
  • 위의 처리를 안 해줬을 때, 주어진 테스트케이스는 통과하지만 안 되는 예 (벽을 부수고 먼저 특정 좌표에 visit 처리를 해주면, 안 부수고 돌아가는 경우 길이 막힐 수 있음)
    6 3
    000
    110
    000
    011
    111
    000
    
  • Bfs에서 queue의 매개변수로 벽을 부쉈는지 체크하는 bool(default : false) 넣어주고, 처음 만난 벽을 부수고 true로 변경 후 visit 변수에도 적용

피드백

  • 처음에는 모든 1에 대해 0으로 한 번씩 바꿔주고, 각각의 상황에서 bfs를 돌렸음 —> 시간초과
  • 심지어 bfs 처리도 좌표를 queue에 넣자마자 방문 처리를 해줘야 메모리 효율을 높일 수 있는데, 좌표에 방문 후 방문처리를 하여 메모리 초과 뜸
  • 당연히 visit변수는 2차원으로 풀려고 계속 노력했지만 안 됨… 히든 테스트케이스 못 찾겠어서 포기함 (설계의 예제 케이스)
  • 생각보다 그래프 문제가 아직도 약함

How I solved(click to github)


ref :
BOJ2206
참고한 다른 블로그

Leave a comment