[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 10026 - 적록색약

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

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

Read More
[C++]BOJ 2583 - 영역 구하기
[C++]BOJ 2468 - 안전 영역

[C++]BOJ 2468 - 안전 영역

범위가 그리 크지 않기 때문에 내리는 비의 양을 완전탐색하고 그때마다 높이를 기준으로 dfs나 bfs를 돌리면 된다.
이 문제는 dfs로 풀어봤다.

Read More
[C++]BOJ 6603 - 로또

[C++]BOJ 6603 - 로또

주어진 집합에서 수 6개를 고르는 경우의 수를 완전탐색하는 문제다.
사전순 출력이기 때문에 dfs로 순차 출력하면 된다.

Read More
[C++]BOJ 11403 - 경로 찾기
[C++]BOJ 11724 - 연결 요소의 개수

[C++]BOJ 11724 - 연결 요소의 개수

단순한 탐색 문제다.
모든 노드를 간선을 따라 탐색하며 방문처리를 한 후, 방문을 안한 노드가 있다면 모든 노드를 방문할 때 까지 탐색하고 총 탐색 횟수를 출력하면 된다.
dfs와 bfs모두 쓸 수 있다.

Read More
[C++]BOJ 14502 - 연구소

[C++]BOJ 14502 - 연구소

주어진 지도의 크기가 최대 8 * 8이므로 바이러스와 벽이 아무것도 없다고 가정하면 벽을 세울 수 있는 경우의 수는 64C3 대략, 40,000 가지이다.
그러므로 벽을 세우는 문제는 완전탐색으로 해결할 수 있다.
벽을 세우는 모든 방법의 수 마다 바이러스가 퍼지는 경우를 dfs로 탐색하고 안전영역이 가장 큰 경우의 수를 기억해 마지막에 전체 칸의 갯수 - 퍼진 바이러스의 갯수 - 처음에 있던 벽의 갯수 - 3을 출력한다.

bfs로도 풀 수 있다. 귀찮아서 안 해봤다.

Read More