티스토리 뷰

알고리즘/백준

[백준] 13908번 비밀번호

머어하지 2018. 10. 29. 16:28

생각

Github - https://github.com/hellojdh/Code/blob/master/src/baekjoon/q10000/Q13908.java 비밀 번호를 알아내려고 한다. 3자리면 000~999 2자리면 00~99 까지 가능하다. n자리의 비밀 번호중 m개의 숫자가 무조건 사용되어야한다. 예를들어 m이 2로 주어지고 3 4 가 주어지면 n이 2라면 34 43 밖에 비밀번호가 될 수 없다. n과 m이 주어질 때, 비밀번호가 될 수 있는게 몇개인지 출력하여라.


처음 생각

n이 최대 7로 모든 경우를 보더라도 0000000~9999999로 천 만개만 봐주면된다. 따라서 완전 탐색을 통해 결과를 얻을 수 있다. 


다음 생각

천 만개에 대해서 매번 생성된 비밀번호마다 반복문을 이용해서 해당 숫자가 있나 없나를 보는것은 비효율 적이므로 재귀를 통해 조합을 생성해주면서 무조건 사용되어야하는 숫자를 사용했을 경우 카운트 변수 cnt를 +1 시켜주어 마지막에 이 cnt 변수가 m개 만큼 올라가 있으면 해당되는 비밀번호이므로 결과 변수를 +1 시켜주었다.


다다음 생각

해당 숫자를 한 번 사용하고 또 사용될 때 cnt 변수를 또 +1 시켜주면 안되기 때문에 한 번 사용하면 잠시 해당 값을 false로 바꿔주어 사용되더라도 cnt 변수가 올라가지 않게 하였다.


다다다음 생각

마우스가 갑자기 고장나 글이 조금 짧아졌지만 아래의 코드를 보면 위의 의미들이 전달 될 것 같다.


방안


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
42
package baekjoon.q10000;
 
import java.util.Scanner;
 
public class Q13908 {
    static int n,m;
    static boolean[] visited;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        visited = new boolean[10];
        // 무조건 써야할 건 true 값을 넣어놔준다.
        for(int i=0;i<m;i++)
            visited[sc.nextInt()] = true;
        // 모든 경우를 살펴보자.
        solve(0,0);
        System.out.println(result);
    }
    
    static int result = 0;
    private static void solve(int idx,int cnt) {
        if(idx==n) {
            // 무조건 사용해야할 m개를 사용하지 않았으면 개수 카운트 x
            if(cnt!=m) return;
            result++;
            return;
        }
        
        for(int i=0;i<=9;i++) {
            // 무조건 사용해야할 것이라면
            if(visited[i]) {
                visited[i] = false;
                // 사용했다고 개수를 올려주자.
                solve(idx+1,cnt+1);
                visited[i] = true;
                continue;
            }
            solve(idx+1,cnt);
        }
    }
}

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 10172번 개  (0) 2018.11.08
[백준] 2741번 N 찍기  (0) 2018.11.05
[백준] 16236번 아기 상어  (0) 2018.10.27
[백준] 16235번 나무 재테크  (3) 2018.10.26
[백준] 16234번 인구 이동  (0) 2018.10.25
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday