문제풀이/백준
[백준]13908: 비밀번호 - JAVA
빈둥벤둥
2021. 5. 28. 13:03
[백준]13908: 비밀번호
https://www.acmicpc.net/problem/13908
13908번: 비밀번호
첫 번째 예제의 경우 가능한 비밀번호의 조합은 07, 17, 27, 37, 47, 57, 67, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 87, 97이다. 두 번째 예제의 경우 가능한 비밀번호의 조합은 34, 43이다.
www.acmicpc.net
풀이
이 문제의 입력 조건에서 n의 범위를 보면 1<=n<=7이다. n의 범위가 크지 않으므로 백트랙킹을 활용하여 완전탐색해 문제를 풀어 줄 것이다.
우선 항상 들어가야하는 숫자는 boolean타입의 배열에서 true로 설정하여 표시해준다. 그 다음에 백트랙킹을 하며 항상 들어가야 하는 숫자를 뽑았을 때에만 카운팅해주었다.
n개의 숫자를 뽑은 후, 카운팅 수가 m과 동일하다면 m개 만큼 카운팅이 되었는지(꼭 포함되어야 하는 m개의 수가 모두 포함되었는지) 확인한 후 m개 만큼 카운팅 되었다면 결과 개수를 더해주었다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
import java.util.*;
public class Main {
static int n, m;
static int count;
static boolean[] visited;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
n = scan.nextInt();
m = scan.nextInt();
visited = new boolean[10];
for(int i = 0; i < m; i++) {
visited[scan.nextInt()] = true;
}
backtracking(0, 0);
System.out.println(count);
}
public static void backtracking(int idx, int cnt) {
if(idx == n) {
if(cnt == m) count++;
return;
}
for(int i = 0; i <= 9; i++) {
if(visited[i]) {
visited[i] = false;
backtracking(idx + 1, cnt + 1);
visited[i] = true;
} else {
backtracking(idx + 1, cnt);
}
}
}
}
|
cs |