2022. 1. 24. 18:06ㆍ알고리즘/백준
문제
키파는 프랑스어를 배우고 있다. 프랑스어는 띄어쓰기 단위로 단어가 완벽하게 분리되는 언어는 아니다.
- 기본적으로는 띄어쓰기나 -(하이픈) 단위로 단어를 구분한다.
- 앞 단어가 ce, je, ne, me, te, se, le, la, de, que 혹은 si이고 뒤 단어가 모음(a, e, i, o, u, h)으로 시작하는 경우, 앞 단어의 마지막 모음이 사라지고, 대신 '(어포스트로피)가 붙으면서 이어진다.
- 프랑스어에서 h는 언제나 묵음이므로, 이 문제에서는 일반적으로 알려진 모음 a, e, i, o, u는 물론이고 h도 모음으로 취급함에 유의하라.
예를 들어, je는 “나”라는 뜻이고, aime는 “(내가) 좋아한다”라는 뜻이고, (les) pommes는 “사과”라는 뜻이다. 이 단어들로 “나는 사과를 좋아한다”라는 프랑스어 문장을 만들 때는 j'aime les pommes와 같이 쓴다. 앞 단어가 je이고 뒤 단어의 모음인 a가 만났기 때문에 e가 사라지고 대신 어포스트로피가 붙은 것이다. 그래서, 프랑스어 초짜인 키파는 이런 식으로 프랑스어 문장의 단어를 쪼개기로 했다.
- 먼저 띄어쓰기와 -(하이픈)을 기준으로 “단어”를 쪼갠다.
- 각각의 “단어”에서, 위처럼 줄어들었을 가능성이 있는 경우(즉, c', j', n', m', t', s', l', d', qu'로 시작하고 어포스트로피 뒤 글자가 모음인 경우) 이 단어들을 한 번 더 분리해 준다.
그런데 생각해 보니 이 과정을 프랑스어 문장에만 적용할 수 있는 것은 아니었다!
임의의 문자열이 주어졌을 때, 키파의 발상대로 단어 단위를 만들었을 경우 몇 단어가 되는지를 구하는 프로그램을 작성하라.
입력
첫째 줄에 “문장”을 나타내는 문자열이 주어진다. 이 문자열은 영어 소문자, 띄어쓰기, -(하이픈), '(어포스트로피)로만 이루어져 있다. 이때 띄어쓰기, 하이픈, 어포스트로피 중 어느 것도 인접해 있지 않고, 문장의 시작이나 끝에 있지 않다.
출력
키파의 발상대로 입력된 “문장”을 단어로 쪼개었을 경우 몇 단어가 되는지를 출력하라.
제한
- “문장”은 길이가 1 이상이고 5,000 이하인 문자열이다.
- “문장”은 영어 소문자, 띄어쓰기, -(하이픈), '(어포스트로피)로만 이루어져 있다.
- 띄어쓰기, 하이픈, 어포스트로피 중 어느 것도 인접해 있지 않고, 문장의 시작이나 끝에 있지 않다.
예제 입력 1
qu'est-ce qu'il mange aujourd'hui
예제 출력 1
7
문제풀이
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.io.*;
interface Main{
static void main(String[] a) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String str = br.readLine();
String regex = "^(c|j|n|m|t|s|l|d|qu)(')[aeiouh]";
Pattern pattern = Pattern.compile(regex);
Matcher matcher;
String[] arr = str.split("[\\s-]");
int cnt = arr.length;
for(String val : arr) {
matcher = pattern.matcher(val);
while(matcher.find()) {
cnt++;
}
}
bw.write(cnt+"");
bw.flush();
}
}
단어 개수 세는 문제인데 먼저 띄어쓰기와 하이픈을 기준으로 쪼개서 세야 하므로 Stirng.split("[\\s-]");을 통해 공백과 하이픈으로 쪼개서 배열을 만들었습니다.
배열을 for 문으로 순회하면서 c, j, n, m, t, s, l, d, qu로 시작하는 글자 뒤에 아포스트로피가 오고 그 뒤에 a, e, i, o, u, h가 오는 경우 단어를 분리해야 해서 해당하는 정규식을 짜서 매칭이 되면 단어 개수를 세도록 하였습니다.
출처 : https://www.acmicpc.net/problem/19844
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 6324번 URLs Java 문제 풀이 (0) | 2022.01.24 |
---|---|
[백준] 1543번 염색체 Java 문제 풀이 (0) | 2022.01.24 |
[백준] 1543번 문서 검색 Java 문제 풀이 (0) | 2022.01.20 |
[백준] 15904번 UCPC는 무엇의 약자일까? Java 문제 풀이 (0) | 2022.01.20 |
[백준] 2870번 수학숙제 Java 문제 풀이 (0) | 2022.01.20 |