[C++]N과 M (9 ~ 12) - BOJ 15663 ~ 15666

[C++]N과 M (9 ~ 12) - BOJ 15663 ~ 15666

이 게시물에는 N과 M 시리즈 9부터 12번까지 4문제의 풀이가 들어있음.
BOJ 15663 15664 15665 15666


모든 조건부 조합의 경우를 출력해야 하는 완전탐색 문제다.
사전순 출력이므로 dfs로 쉽게 풀 수 있다.
cout << endl; 는 느리게 작동하므로 cout << "\n"; 를 사용해야 한다.

앞선 5 ~ 8번 문제들과 다르게 주어지는 수 중에 중복되는 숫자가 존재한다.

중복된 수열을 출력하면 안되므로 같은 레벨의 depth에서 같은 수를 중복해서 호출하지 않도록 해야 한다.
따라서 tmp에 해당 값을 담고 매번 체크하며 넘어간다.
여기서 tmp는 지역변수로 정의해야한다.
각 depth의 tmp는 dfs가 호출 될 때 마다 의미하는 바가 다르기 때문이다.


Read More
[C++]N과 M (5 ~ 8) - BOJ 15654 ~ 15657

[C++]N과 M (5 ~ 8) - BOJ 15654 ~ 15657

이 게시물에는 N과 M 시리즈 5부터 8번까지 4문제의 풀이가 들어있음.
BOJ 15654 15655 15656 15657


모든 조건부 조합의 경우를 출력해야 하는 완전탐색 문제다.
사전순 출력이므로 dfs로 쉽게 풀 수 있다.
cout << endl; 는 느리게 작동하므로 cout << "\n"; 를 사용해야 한다.

앞선 1 ~ 4번 문제들과 다르게 주어진 수 들로 수열을 만들어야 한다.
또 숫자를 입력받고 오름차순 정렬해야 사전순 출력이 쉽다.
그 부분을 제외하고 방식은 동일하다.


Read More
[C++]N과 M (1 ~ 4) - BOJ 15649 ~ 15652

[C++]N과 M (1 ~ 4) - BOJ 15649 ~ 15652

이 게시물에는 N과 M 시리즈 1부터 4번까지 4문제의 풀이가 들어있음.
BOJ 15649 15650 15651 15652


모든 조건부 조합의 경우를 출력해야 하는 완전탐색 문제다.
사전순 출력이므로 dfs로 쉽게 풀 수 있다.
cout << endl; 는 느리게 작동하므로 cout << "\n"; 를 사용해야 한다.


Read More
[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