본문 바로가기
Problem Solving/SWEA

[SWEA] 7675. 통역사 성경이

by 테리는당근을좋아해 2020. 2. 27.

문제

성경이는 대통령 직속 통역관이다.

대통령은 사람 이름을 외우는 것을 굉장히 중요시 한다.

따라서 외국 대사와의 대화에서 나오는 모든 이름을 외워달라고 성경이에게 부탁했다.

외국 대사는 총 N개의 문장을 말했다.

각 문장의 마지막 단어는 세 가지 구두점 ‘.’, ‘?’, ‘!’ 중 하나를 마지막에 포함한다.

문장은 대소문자 알파벳와 숫자로 이루어진 단어들이 공백을 사이에 두고 구성되어 있으며, 예외적으로 마지막 단어는 구두점으로 끝나게 된다.

이름은 대문자 알파벳으로 시작하며 나머지는 소문자 알파벳인 단어들이다.

예외적으로, 단어의 마지막이 구두점일 경우에도 이름이며, 대문자 한글자도 이름이다.

성경이는 대통령을 위해서 외국 대사와의 대화를 문서로 받아서 이름이 몇 번 나오는 지를 알려줘야 한다.

N개의 문장을 받아서 문장 별로 이름의 개수를 구하여라.

 

풀이방법

이 문제를 풀면서 조금 고민했던 부분은 문자열을 읽어들이는 방법이다.

 

n개의 띄어쓰기가 포함된 문장이 입력되는데, 이 문장들은 개행이 포함될 수도 있다.

 

따라서 단어를 단위로 무한 루프를 돌려 문자열을 계속 입력받되, '?', '!', '.'개 포함된 단어가 n번째 입력된 순간 반복문을 종료한다.

 

각 단어를 검사하는 조건은

 

1) 단어의 첫 문자가 대문자로 이루어져있는 지 검사한다.

 

2) 단어의 맨 끝 문자가 '?', '!', '.'인 특수문자인지 검사한다.

 

3) 만약 2)에서 특수문자가 나온다면 특수문자의 바로 앞까지, 특수문자가 아니라면 단어의 맨 끝까지 소문자로 이루어져있는지 검사한다.

 

소스코드

package samsung;

import java.util.*;

public class s_7675 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int tc = sc.nextInt();
		int[] stop = {'.', '?', '!'};
		
		for(int t = 1; t <= tc; t++) {
			int n = sc.nextInt();
			int cnt = 0;
			int[] a = new int[n];
			
			while(true) {
				if(cnt == n)
					break;
				String s = sc.next();
				if(65 <= s.charAt(0) && s.charAt(0) <= 90) {
					int flag = 0;
					int last = s.length() - 1;
					if(s.charAt(last) == 46 || s.charAt(last) == 33 || s.charAt(last) == 63)
						last--;
					for(int i = 1; i <= last; i++) {
						if(s.charAt(i) < 97 || s.charAt(i) > 122) {
							flag = 1;
							break;
						}
					}
					if(flag == 0)
						a[cnt]++;
				}
				for(int i = 0; i < 3; i++) {
					if(s.charAt(s.length() - 1) == stop[i]) {
						cnt++;
						break;
					}
				}
			}
			System.out.print("#" + t + " ");
			for(int i = 0; i < n; i++) {
				System.out.print(a[i] + " ");
			}
			System.out.println();
		}
	}
}

 

댓글