Post

[BaekJoon] #33702 - 비밀번호 [Java][C++]

[BaekJoon] #33702 - 비밀번호 [Java][C++]

문제 링크


1. 아이디어

시작 번호가 주어졌을 때 만들 수 있는 서로 다른 비밀번호의 개수를 구하는 문제로 DFS를 활용해서 해결할 수도 있지만 버튼이 $3 \times 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. 복잡도

접근시간공간
풀이$O(1)$$O(1)$

3. 코드

풀이 [Java][C++]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 != 0) {
            System.out.println(8);
        } else {
            System.out.println(0);
        }
    }
}
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;
    }
}

This post is licensed under CC BY 4.0 by the author.