오늘의 문제!
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 연산으로 전부 사용됐는지 체크하면 끝.
오늘도 하나 배웠당