[C++]BOJ 2644 - 탈출

[C++]BOJ 2644 - 탈출

돌이 ‘X’라는 말을 못봐서 틀렸다. 이런거 못보고 지나쳐서 틀렸을때는 매우 화난다. 그리고 이런곳에서 틀릴거라곤 상상도 못하기 때문에 해결하는데 시간도 오래걸린다.

아무튼 bfs다.
한칸씩 확장해나가기 위해 큐 사이즈를 기준으로 while을 번갈아가며 돌린다.
비버가 굴에 도착하면 확장시킨 횟수를 출력한다.
비버가 굴로 못들어가면 “선인장”을 출력한다.

Read More
[C++]BOJ 2644 - 촌수계산

[C++]BOJ 2644 - 촌수계산

말이 촌수계산이지 그냥 노드와 노드사이의 거리를 구하면 된다.
최소 길이를 구하면 되므로 시작노드를 기준으로 bfs돌리면 된다.

Read More
[C++]BOJ 2206 - 벽 부수고 이동하기

[C++]BOJ 2206 - 벽 부수고 이동하기

bfs로 갈 수 있는 경로를 탐색하면서 벽을 만났을 때 벽을 부순적이 없다면 벽을 부수고 이동하고 벽을 부순적이 있다면 지나간다.
벽을 부순적이 있는가 여부를 담을 큐 하나를 추가로 만들어주고 x, y와 함께 담아서 매칭시킨다.
처음에는 방문처리를 위한 v배열을 2차원으로 구성했는데 오답으로 처리됐다.
이유를 생각해보니 같은 위치에 있더라도 벽을 부순적이 있는 경로를 지나쳤거나 부순적이 없는 경로를 지나쳤거나 두 가지 경우가 있기 때문에 몇가지 경우의 수가 누락된다.
따라서 같은 위치라도 부순적이 있을 때, 없을 때도 고려해서 방문처리를 해 주어야 한다.

Read More
[C++]BOJ 13460 - 구슬 탈출 2

[C++]BOJ 13460 - 구슬 탈출 2

처음에 시도했던 방법은 bfs에서 각 4가지 방향으로 기울였을 때 도달하는 지점의 좌표를 리턴하는 함수를 구현해 사용하는 것이었는데, 이후에 빨간 구슬과 파란 구슬은 동시에 같은 칸에 있을 수 없다. 라는 문구를 보고 한참동안 뇌정지가 왔다.
어찌보면 당연하다. 구슬은 물리적으로 겹쳐질 수 없다.
구슬이 겹쳐지지 않는 경우를 알기 위해서 가장 쉽게 생각할 수 있는 방법은 구슬의 이동거리를 측정하는 것이다.

Read More
[C++]BOJ 7562 - 나이트의 이동

[C++]BOJ 7562 - 나이트의 이동

나이트가 이동할 수 있는 자리를 bfs나 dfs로 탐색해나가다 도착점까지의 이동횟수를 출력하면 된다.
테스트케이스가 여러개라서 이 부분을 깔끔하게 처리해야한다.

Read More
[C++]BOJ 10026 - 적록색약

[C++]BOJ 10026 - 적록색약

문자열 입력인 문제가 오랜만이라 한번 틀렸다ㅠ
입력 받을 때 주의할 것.
무작정 두가지 경우를 다 돌려도 되지만 더 간단하게 짜봤다.
핵심은 적록색약이 아닌 사람을 탐색할 때 R을 B로 바꿔버리는 것이다.
그러면 적록색약인 사람을 탐색할 때 R은 전부 B로 바뀌어 조건에 맞게 탐색하게 된다.
dfs로 풀어봤다.

Read More
[C++]BOJ 7569 - 토마토

[C++]BOJ 7569 - 토마토

재밌는 문제다.
같은 이름의 문제가 두 개인데 이 문제 -> 토마토는 2차원 공간에서의 탐색이라면 지금 이 문제는 3차원 공간에서의 탐색이다.
기본적인 풀이는 2차원 토마토와 같고 축 하나만 더 추가하면 된다.
bfs로 풀었다.

Read More