-
Notifications
You must be signed in to change notification settings - Fork 1
/
p1062.java
137 lines (122 loc) · 3.71 KB
/
p1062.java
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*
모든 단어는 "anta"로 시작하고 "tica"로 끝나기 때문에 우선 5개의 알파벳은 고정이다.
따라서 k가 5보다 작으면 어느 단어도 읽을 수 없고, k가 26이라면 모든 단어를 읽을 수 있다.
따라서 나머지 문자들에 대해서 백트래킹을 이용하여 탐색하면 된다.
*/
import java.io.*;
import java.util.*;
public class p1062 {
static int n, k, max = 0;
static boolean[] visit = new boolean[26];
static String[] strArr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
strArr = new String[n];
if (k < 5) {
System.out.println(0);
return;
} else if (k == 26) {
System.out.println(n);
return;
} else {
for (int i = 0; i < n; i++) {
String input = br.readLine();
strArr[i] = input.substring(4, input.length() - 4);
}
k -= 5;
visit['a' - 97] = true;
visit['n' - 97] = true;
visit['t' - 97] = true;
visit['i' - 97] = true;
visit['c' - 97] = true;
bt(0, 0);
System.out.println(max);
}
}
static void bt(int start, int depth) {
if (depth == k) {
int rs = 0;
for (int i = 0; i < n; i++) {
boolean isTrue = true;
for (int j = 0; j < strArr[i].length(); j++) {
if (!visit[strArr[i].charAt(j) - 97]) {
isTrue = false;
break;
}
}
if (isTrue) {
rs++;
}
}
max = Math.max(max, rs);
return;
}
for (int i = start; i < 26; i++) {
if(!visit[i]) {
visit[i] = true;
bt(i, depth + 1);
visit[i] = false;
}
}
}
}
/**** 백트래킹 함수에서 이와 같이 비트마스킹으로 풀 수 도 있다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
static int N, K;
static int answer = 0;
static int[] words;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] outline = br.readLine().split(" ");
N = Integer.parseInt(outline[0]);
K = Integer.parseInt(outline[1]);
if(K <5) {
System.out.println(answer);
return;
}else if(K == 26) {
System.out.println(N);
return;
}
K -=5;
words = new int[N];
for(int i=0; i<N; i++) {
String line = br.readLine();
for(int j=0; j<line.length(); j++) {
char values = line.charAt(j);
int index = values - 'a';
words[i] |= 1<<index;
}
}
int standard = 0;
standard |= 1<<('a' -'a');
standard |= 1<<('n' -'a');
standard |= 1<<('t' -'a');
standard |= 1<<('c' -'a');
standard |= 1<<('i' -'a');
combination(0, 0,standard);
System.out.println(answer);
}
public static void combination(int index,int start, int flag) {
if(index == K) {
int result = 0;
for(int word : words) {
// flag = 내가 읽을 수 있는 전체 집합 true면 새로운 단어는 없다.
if( (word | flag) == flag)
result ++;
}
answer = answer >= result ? answer : result;
return;
}
for(int i= start; i<26; i++) {
if((flag & 1<<i) == 0) {
combination(index+1, i+1, flag | 1<<i);
}
}
}
}
*/