2026.03.30 월

권순찬·2026년 3월 30일

천천히 꾸준히

목록 보기
27/50

오늘의 문제!

비밀번호_13908

import java.io.*;
import java.util.StringTokenizer;

public class 비밀번호_13908 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        int[] arr = new int[m];

        if (m > 0) {
            st = new StringTokenizer(br.readLine());
            for (int i = 0; i < m; i++) {
                arr[i] = Integer.parseInt(st.nextToken());
            }
        }

        int maxValue = 1;
        for (int i = 0; i < n; i++) {
            maxValue *= 10;
        }

        int result = 0;
        boolean[] check = new boolean[10];

        for (int i = 0; i < maxValue; i++) {
            for (int j = 0; j < 10; j++) {
                check[j] = false;
            }

            int temp = i;

            for (int j = 0; j < n; j++) {
                int digit = temp % 10;
                check[digit] = true;
                temp /= 10;
            }

            boolean flag = true;
            for (int j = 0; j < m; j++) {
                if (!check[arr[j]]) {
                    flag = false;
                    break;
                }
            }

            if (flag) {
                result++;
            }
        }

        bw.write(result + "\n");
        bw.flush();
        bw.close();
    }
}

말하자마자 정렬과는 상관없는 문제가 나와버렸다ㅏ..
일단은 n이 7까지 나올 수 있어서 1000만정도길래 브루트포스로 풀었다.
각 숫자가 m개의 숫자를 전부 포함할때만 카운트를 증가시키는식!

근데 좀 찾아보니까 비트마스킹을 사용하면 좀 더 간결하게 코드를 짤 수 있더라.
1. boolean 배열 대신 int 하나로 퉁쳐지고,
2. OR 연산으로 원하는 자리를 1로 만든뒤,
3. AND 연산으로 전부 사용됐는지 체크하면 끝.

오늘도 하나 배웠당

profile
아직 많이 서툰 개발자

0개의 댓글