백준 13460번 - 구슬 탈출 2

문제

https://www.acmicpc.net/problem/13460

해설

N*M 크기의 보드를 4방향으로 기울여서, 파란 구슬과 빨간 구슬을 굴려 빨간 구슬만 구멍에 빠지게 하는 최소 횟수를 구하는 문제입니다. 현재 상태에서 4가지 방향으로 기울이는 4가지 경우를 탐색해 나가면 됩니다.

시간복잡도 계산

3≤N,M≤103 \leq N, M \leq 10 이고 4방향으로 최대 10회 탐색하므로, 최대 uptime은 대략 max(N,M)×410≤1018max(N, M) \times 4^10 \leq 10^{18} 입니다. 따라서 단순히 BFS와 Brute-force를 사용할 수 있습니다.

구현

입력을 받을 때, 구슬과 구멍의 위치는 따로 저장해 둡니다.

현재 상태를 기준으로

  • 위쪽으로 기울였을 때 변화된 상태
  • 오른쪽으로 기울였을 때 변화된 상태
  • 아래쪽으로 기울였을 때 변화된 상태
  • 왼쪽으로 기울였을 때 변화된 상태 이 4가지 경우를 BFS로 탐색해 나갈 수 있습니다. 최대 탐색 깊이는 10회 이하로 제한합니다.

1번 기울였을 때, 구슬은 벽이나 구멍을 만나면 더 이상 구르지 않습니다. 따라서

  • 구슬이 구멍에 빠진 경우

    • 빨간 구슬이 먼저 구멍에 빠졌다면, 성공
    • 파란 구슬이 먼저 구멍에 빠졌다면, 실패
  • 구슬이 벽에 닿은 경우

    • 빨간 구슬과 파란 구슬이 다른 경로로 굴렀다면, 아무 일도 없음
    • 빨간 구슬과 파란 구슬이 같은 경로로 굴렀다면, 구슬의 위치를 재조정

visit 배열을 사용해서 이전 상황과 중복된 위치에 구슬이 있을 경우 제외합니다.

소스 코드

http://boj.kr/47d4f461d3b842b2a33bf45952b0ae8a

코멘트

문제 자체는 전형적인 BFS문제지만, 각 경우에 대한 예외처리를 고민하는데 여러 시간이 걸렸습니다... 삼성 코드테스트를 기반으로 한 문제들은 전반적으로 까다로운 구현을 요구하는 것 같습니다. 침착하게 펜과 종이로 그려보면서 생각하는 것이 도움이 되었습니다.


참고

© 2020 Hyowon Kim, Built with Gatsby