[백준] 19844번 단어 개수 세기 Java 문제 풀이

2022. 1. 24. 18:06알고리즘/백준

728x90
반응형

문제

키파는 프랑스어를 배우고 있다. 프랑스어는 띄어쓰기 단위로 단어가 완벽하게 분리되는 언어는 아니다.

  • 기본적으로는 띄어쓰기나 -(하이픈) 단위로 단어를 구분한다.
  • 앞 단어가 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

 

19844번: 단어 개수 세기

첫째 줄에 “문장”을 나타내는 문자열이 주어진다. 이 문자열은 영어 소문자, 띄어쓰기, -(하이픈), '(어포스트로피)로만 이루어져 있다. 이때 띄어쓰기, 하이픈, 어포스트로피 중 어느 것도 인

www.acmicpc.net

 

728x90
반응형