[Java] 백준 1316번

Input-1
3
happy
new
year
Output-1
3
Input-2
4
aba
abab
abcabc
a
Output-2
1
Input-3
5
ab
aa
aca
ba
bb
Output-3
4
문제 풀이
주어진 단어를 순회하며 문자별로 그룹단어인지 검증하기 위해서는 아래의 조건이 검증되어야 한다.
- 문자가 중복으로 입력되었을 경우(단, 연속된 문자는 예외)
상기 조건이 충족되는 경우 그룹단어가 아닌 것으로 간주한다.
substring() 함수를 통해 현재문자 이후의 문자열을 슬라이싱하여 another 변수에 담는다.
현재 문자가 another 값에 포함되었다면, 연속된 문자열인지를 검증할 수 있다.
연속된 문자열이 아니라 중복된 문자열일 경우 그룹단어가 아니므로 개수를 세면 안된다.
예를 들어 happy의 경우 첫번째 p에서 그룹단어 여부를 검증하게 된다.
그런데 pp는 연속된 문자열이기에 중복된 문자열로 보지 않는다.
1
2
3
4
5
6
7
8
9
10
11
12
for (int j=1; j<str.length(); j++) {
String another = str.substring(j, str.length()); // 현재문자 이후의 문자열
if(another.contains(strs[j-1])) { // 현재문자가 이후 문자열에 포함되었다면(중복)
if(strs[j-1].equals(strs[j])) {
continue;
}
else {
cnt -= 1;
break;
}
}
}
작성코드
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
import java.io.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
int cnt = n;
for (int i=0; i<n; i++) {
String str = br.readLine();
String[] strs = str.split("");
for (int j=1; j<str.length(); j++) {
String another = str.substring(j, str.length());
if(another.contains(strs[j-1])) {
if(strs[j-1].equals(strs[j])) {
continue;
}
else {
cnt -= 1;
break;
}
}
}
}
bw.write(cnt + "\n");
bw.flush();
bw.close();
br.close();
}
}
회고
- 패턴을 구성할 때 연속된 문자열은 제외하고 중복된 문자열을 어떻게 찾을까 고민을 많이 했다.
- 복잡하기보단 단순하게 현재 문자 이후의 문자열에 포함여부를 어떻게 알 수 있을까? 라는 생각으로 접근하여 해결하였다.