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