[BaekJoon] 33702번 - 비밀번호 [Java][C++]
1. 문제 풀이
시작 번호가 주어졌을 때 만들 수 있는 서로 다른 비밀번호의 개수를 구하는 문제로 DFS를 활용해서 해결할 수도 있지만 버튼이 3 by 3 크기라는 점에서 관찰을 통해서도 해결할 수 있다. 먼저 대칭성이 있으므로 코너 쪽에서 시작하는 경우, 코너 사이의 변에서 시작하는 경우, 중앙에서 시작하는 경우만 구하면 되며 1, 2, 5 위치에서 시작했을 때를 구하겠다.
1의 위치에서 시작하는 경우 1 -> 2 -> 3 -> 6 -> 5 -> 4 -> 7 -> 8 -> 9 로 이어지는 한 가지 경우를 찾을 수 있다. 이때 5 이후로는 외통수이므로 다음은 1 -> 2 -> 3 -> 6 -> 9 로 시작하는 경우를 찾아야하며 8 -> 5 -> 4 -> 7, 8 -> 7 -> 4 -> 5 로 두 가지 경우가 있다. 이렇게 1 -> 2 -> 3 -> 6 으로 시작하는 경우 하위 경로 3개를 찾았고 3 다음은 6이 외길이므로 다음은 1 -> 2 -> 5 로 시작하는 라인을 찾아야하는데 1 -> 2 -> 5 로 시작 시 3에서 끝나야하므로 1 -> 2 -> 5 -> 4 -> 7 -> 8 -> 9 -> 6 -> 3 한 가지 경우 밖에 없다. 1 -> 2로 시작하는 경로는 총 4개다. 1 -> 4 로 시작하는 라인은 위에 구한 경우와 그대로 대칭이 되므로 1로 시작하는 비밀번호는 총 8개이며 이는 3, 7, 9도 동일하다. 예제에서 3의 경우 8로 알려줬으므로 굳이 안구해도 되긴 한다.
2의 위치에서 시작하는 경우는 경로가 존재하지 않는데 전체 숫자 중 홀수의 개수는 5개고 짝수의 개수는 4개다. 상하좌우로 이동할 경우 어디서 이동하든 항상 홀수는 짝수로, 짝수는 홀수로 이동하게 되는데 이 때문에 홀짝이 반복되며 홀수칸에서 시작해서 홀수칸에서 끝나야 한다.
5의 위치에서 시작하는 경우 짝수 칸으로 이동하게 되며 이후 시계 방향 또는 반시계 방향으로 방문하는 외통수만 존재한다. 각 짝수 칸당 2가지 경우가 있으므로 총 8가지 경우가 있게 된다.
2. 코드
1. 풀이 [Java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int k = Integer.parseInt(br.readLine());
if (k % 2 == 1) {
System.out.println(8);
} else {
System.out.println(0);
}
}
}
2. 풀이 [C++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int k;
cin >> k;
if (k % 2) {
cout << 8;
} else {
cout << 0;
}
}