알고리즘 연습/기초 (입출력 등)

[🥉2 / 백준 10820 / 파이썬, 자바] 문자열 분석

김세진 2021. 10. 29. 20:13
반응형

 

 

10820번: 문자열 분석

문자열 N개가 주어진다. 이때, 문자열에 포함되어 있는 소문자, 대문자, 숫자, 공백의 개수를 구하는 프로그램을 작성하시오. 각 문자열은 알파벳 소문자, 대문자, 숫자, 공백으로만 이루어져 있

www.acmicpc.net

 

문제

문자열 N개가 주어진다. 이때, 문자열에 포함되어 있는 소문자, 대문자, 숫자, 공백의 개수를 구하는 프로그램을 작성하시오.

각 문자열은 알파벳 소문자, 대문자, 숫자, 공백으로만 이루어져 있다.

입력

첫째 줄부터 N번째 줄까지 문자열이 주어진다. (1 ≤ N ≤ 100) 문자열의 길이는 100을 넘지 않는다.

출력

첫째 줄부터 N번째 줄까지 각각의 문자열에 대해서 소문자, 대문자, 숫자, 공백의 개수를 공백으로 구분해 출력한다.

 

예제 입력 

This is String
SPACE    1    SPACE
 S a M p L e I n P u T     
0L1A2S3T4L5I6N7E8

예제 출력 

10 2 0 2
0 10 1 8
5 6 0 16
0 8 9 0

 

풀이

 

입력된 문자열을 분석하여 소문자, 대문자, 숫자, 공백의 개수를 구해야 한다.

 

 

이 문제에서는 두 가지 유의점이 있다.

 

하나는 입력이 몇 줄 들어오는지 알 수 없다는 것이다.

즉, EOF(End-of-file) 처리를 해주어야 한다.

파이썬에서는 sys.stdin.readline 대신 sys.stdin.read 를 통해 문자열을 개행 문자를 포함하여 한 번에 받아올 수 있다.

 

나머지 하나는 입력의 마지막에 길이가 0인 문자열, 즉 엔터만 입력될 수도 있다는 것이다.

따라서 문자열을 분석할 때, 길이가 1 이상인 문자열만 분석을 시도하도록 해야 한다.

 

 

파이썬은 ord 함수를 통해 특정 문자열 한 개, 즉 chr 형을 아스키 코드로 변환할 수 있다.

각 문자가 가지는 아스키 코드의 범위로 문제를 해결한다.

 

import sys
input = sys.stdin.read

s = input().split("\n")
for line in s:
    if not line:
        continue
    ans = [0]*4
    for i in line:
        i = ord(i)
        if i >= 97 and i <= 122:
            ans[0] += 1
        elif i >= 65 and i <= 90:
            ans[1] += 1
        elif i >= 48 and i <= 57:
            ans[2] += 1
        else:
            ans[3] += 1
    print(*ans)

 

자바 풀이

 

자바의 경우 charAt 메소드를 통해 문자열의 해당 인덱스에 위치한 문자를 char 형태로 반환할 수 있다.

마찬가지로 각 문자가 가지는 아스키 코드의 범위로 문제를 해결한다.

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {

	public static void main(String args[]) throws Exception{
		BufferedReader br = new BufferedReader (new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter (new OutputStreamWriter(System.out));
		
		
		while(true) {
			String s = br.readLine();
			if(s==null) {
				break;
			}
			
			int[] ans = new int[4];
			for(int i=0; i<s.length(); i++) {
				char c = s.charAt(i);
				if (c>=97 && c<=122) ans[0] += 1;
				else if (c>=65 && c<=90) ans[1] += 1;
				else if (c>=48 && c<=57) ans[2] += 1;
				else ans[3] += 1;
			}
			for(int i=0;i<4;i++) {
				bw.append(String.valueOf(ans[i] + " "));
			}
			bw.append("\n");
		}
		bw.flush();
		
	}
}
반응형