[문제]
[풀이방법]
간단한 문자열 문제입니다. 문장의 개수가 주어지지만 구두점을 기준으로 문장의 끝을 나눠야 하기 때문에 문자열을 탐색하면서 처리했습니다.
구두점 ( . ! ?) 이 나오면 문장의 끝이므로 그때의 index를 저장하고 문자열을 substring으로 구했습니다.
한 문장에는 여러 개의 단어가 나올 수 있으므로 공백을 기준으로 split 한 다음 이름을 찾는 규칙
- 이름은 대문자 알파벳으로 시작하며 나머지는 소문자 알파벳인 단어들이다.
- 예외적으로, 단어의 마지막이 구두점일 경우에도 이름이며, 대문자 한글자도 이름이다.
에 맞추어서 첫 번째 문자가 대문자이고 그 다음 문자들이 소문자이거나 구두점으로 끝나는 경우에는 이름의 개수를 세는 result 변수를 1만큼 증가시켜줬습니다.
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
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuffer sf = new StringBuffer();
int t = Integer.parseInt(st.nextToken());
for (int tc = 1; tc <= t; tc++) {
st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
String s = br.readLine();
int idx_end = 0;
int idx_start = 0;
int res= 0;
int cnt = 0;
for (int i = 0; i < s.length(); i++) {
idx_start = idx_end;
if (s.charAt(i) == '?' || s.charAt(i) == '!' || s.charAt(i) == '.') {
//한 문장의 끝
idx_end = i+1; //이 인덱스부터는 다음 문장의 시작이다.
res = 0; //한 문장에서 나오는 이름의 개수를 구해야하기 때문에 초기화
cnt++;
}
if (idx_start < idx_end) {
String tmp = s.substring(idx_start, idx_end).trim(); // 한 문장을 가져와야 한다.
String[] words = tmp.split(" ");
for (int j = 0; j< words.length; j++) {
//이름 규칙에 따라이름의 개수를 가져온다.
/*
* 이름은 대문자 알파벳으로 시작하며 나머지는 소문자 알파벳인 단어들이다.
예외적으로, 단어의 마지막이 구두점일 경우에도 이름이며, 대문자 한글자도 이름이다.
*/
if ('A' <= words[j].charAt(0) && words[j].charAt(0) <= 'Z') {
//첫 글자가 대문자일 때
//나머지 글자가 모두 소문자일 경우나 한 글자인 경우에는이름
//마지막이 구두점이어도 된다.
if (words[j].length() == 1) res++;
else {
boolean ok = true;
int end_idx = 0;
for (int k = 1; k < words[j].length(); k++) {
if (!('a' <= words[j].charAt(k) && words[j].charAt(k) <= 'z')) {
ok = false;
end_idx = k;
break;
}
}
if (end_idx == words[j].length()-1 && (words[j].charAt(end_idx) == '?' || words[j].charAt(end_idx) == '!' || words[j].charAt(end_idx) == '.') ) {
ok = true;
}
if (ok) res++;
}
}
}
}
}
sf.append('\n');
}
System.out.println(sf.toString());
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs |