[C++]BOJ 2644 - 탈출
돌이 ‘X’라는 말을 못봐서 틀렸다. 이런거 못보고 지나쳐서 틀렸을때는 매우 화난다. 그리고 이런곳에서 틀릴거라곤 상상도 못하기 때문에 해결하는데 시간도 오래걸린다.
아무튼 bfs다.
한칸씩 확장해나가기 위해 큐 사이즈를 기준으로 while을 번갈아가며 돌린다.
비버가 굴에 도착하면 확장시킨 횟수를 출력한다.
비버가 굴로 못들어가면 “선인장”을 출력한다.
돌이 ‘X’라는 말을 못봐서 틀렸다. 이런거 못보고 지나쳐서 틀렸을때는 매우 화난다. 그리고 이런곳에서 틀릴거라곤 상상도 못하기 때문에 해결하는데 시간도 오래걸린다.
아무튼 bfs다.
한칸씩 확장해나가기 위해 큐 사이즈를 기준으로 while을 번갈아가며 돌린다.
비버가 굴에 도착하면 확장시킨 횟수를 출력한다.
비버가 굴로 못들어가면 “선인장”을 출력한다.
말이 촌수계산이지 그냥 노드와 노드사이의 거리를 구하면 된다.
최소 길이를 구하면 되므로 시작노드를 기준으로 bfs돌리면 된다.
bfs로 갈 수 있는 경로를 탐색하면서 벽을 만났을 때 벽을 부순적이 없다면 벽을 부수고 이동하고 벽을 부순적이 있다면 지나간다.
벽을 부순적이 있는가 여부를 담을 큐 하나를 추가로 만들어주고 x, y와 함께 담아서 매칭시킨다.
처음에는 방문처리를 위한 v배열을 2차원으로 구성했는데 오답으로 처리됐다.
이유를 생각해보니 같은 위치에 있더라도 벽을 부순적이 있는 경로를 지나쳤거나 부순적이 없는 경로를 지나쳤거나 두 가지 경우가 있기 때문에 몇가지 경우의 수가 누락된다.
따라서 같은 위치라도 부순적이 있을 때, 없을 때도 고려해서 방문처리를 해 주어야 한다.
처음에 시도했던 방법은 bfs에서 각 4가지 방향으로 기울였을 때 도달하는 지점의 좌표를 리턴하는 함수를 구현해 사용하는 것이었는데, 이후에 빨간 구슬과 파란 구슬은 동시에 같은 칸에 있을 수 없다. 라는 문구를 보고 한참동안 뇌정지가 왔다.
어찌보면 당연하다. 구슬은 물리적으로 겹쳐질 수 없다.
구슬이 겹쳐지지 않는 경우를 알기 위해서 가장 쉽게 생각할 수 있는 방법은 구슬의 이동거리를 측정하는 것이다.
나이트가 이동할 수 있는 자리를 bfs나 dfs로 탐색해나가다 도착점까지의 이동횟수를 출력하면 된다.
테스트케이스가 여러개라서 이 부분을 깔끔하게 처리해야한다.
문자열 입력인 문제가 오랜만이라 한번 틀렸다ㅠ
입력 받을 때 주의할 것.
무작정 두가지 경우를 다 돌려도 되지만 더 간단하게 짜봤다.
핵심은 적록색약이 아닌 사람을 탐색할 때 R을 B로 바꿔버리는 것이다.
그러면 적록색약인 사람을 탐색할 때 R은 전부 B로 바뀌어 조건에 맞게 탐색하게 된다.
dfs로 풀어봤다.
재밌는 문제다.
같은 이름의 문제가 두 개인데 이 문제 -> 토마토는 2차원 공간에서의 탐색이라면 지금 이 문제는 3차원 공간에서의 탐색이다.
기본적인 풀이는 2차원 토마토와 같고 축 하나만 더 추가하면 된다.
bfs로 풀었다.