문제
그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다.
단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.
문제풀이
1. 문자열 s을 입력받고 각 문자들을 순서대로 검사를 한다. 그런데 어떻게 검사를 하느냐...
2. s_compare이라는 텅빈 비교 문자열을 만들고 문자열 s에서 문자 하나 더한다.
3. 그리고 문자열 s을 순차적으로 순회하면서 s_compare에 있는 문자와 같은지 비교한다.
4. 만약 계속 같은 문자가 나온다면 다른 문자가 나올 때까지 증가하면서 비교한다.
5. 그렇게 순회하다가 만약 다른 문자가 나왔을 땐 s_compare에 해당 문자가 없기 때문에 또 다른 문자가 처음 등장했다는 것을 알 수 있다. 따라서 해당 문자를 s_compare에 해당 문자를 더하고 다시 그 다음부터 s의 문자가 s_compare에 있는지 확인하는 작업을 수행한다.
6. 하지만 순회하다가 다른 문자를 만났는데 만약 s_compare에 이미 등록되어 있는 문자이고 그 전 문자와 다르다면 이 문자는 재등장한 것이므로 그 문자열 s는 그룹 단어가 아니게 된다.
즉, s의 문자가 s_compare 문자열에 존재하는지 contains()메소드를 써서 검사를 하는 방식으로 이 단어가 그룹 단어인지 아닌지 판별하는 알고리즘이라고 할 수 있다.
소스코드
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
|
import java.io.*;
import java.util.StringTokenizer;
public 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(new StringTokenizer(br.readLine()).nextToken());
String s;
String s_compare;
int flag;
int cnt=0;
for(int i = 0; i < n ; i++) {
flag = 0;
s_compare = "";
s = br.readLine();
// 1.
for(int j = 0; j < s.length() ; j++) {
// 1-1.
s_compare += s.charAt(j);
for(int k = j+1 ; k < s.length() ; k++) {
if(!s_compare.contains(String.valueOf(s.charAt(k)))) {
j += k-j-1;
break;
// 2.
} else {
if(s.charAt(k) != s.charAt(k-1)) {
flag = 1;
break;
}
}
}
if(flag==1) break;
}
// 3.
if(flag==0) cnt++;
}
bw.write(cnt+"");
bw.flush();
bw.close();
}
}
/*
1. 문자열에서 각 문자들이 처음 나타난 건지 이전에 나타난 적이 있는지 확인한다.
1-1. 확인할 때는 해당 문자를 s_compare이라는 변수에 더하고 contains 메소드를 통해 그 문자가 s_compare이라는 문자열 속에 존재하는지 확인하는 방법을 사용한다.
2. 만약 이전에 나타난 적이 있다면 그 문자가 바로 전 문자와 같은지 비교해서 바로 전 문자와 같다면 pass, 바로 전 문자와 다르다면 break를 한다.
3. 문자열의 모든 문자가 연속해서 나타난다면 cnt를 증가시킨다.
*/
|
cs |
'백준 온라인 저지 문제풀이 > JAVA' 카테고리의 다른 글
[baekjoon 2839번] 수학1 - 설탕배달 (0) | 2020.12.04 |
---|---|
[baekjoon 1712번] 수학1 - 손익분기점 (0) | 2020.12.04 |
[baekjoon 2941번] 문자열 - 크로아티아 알파벳 (0) | 2020.12.02 |
[baekjoon 5622번] 문자열 - 다이얼 (0) | 2020.12.02 |
[baekjoon 2908번] 문자열 - 상수 (0) | 2020.12.02 |