본문 바로가기

algorithm/백준알고리즘

[백준알고리즘] 10820번: 문자열 분석 -Python

728x90

[백준알고리즘] 10820번: 문자열 분석 -Python

https://www.acmicpc.net/problem/10820

 

10820번: 문자열 분석

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

www.acmicpc.net

이번 문제는 문자의 타입을 구분하는 문제이다. 파이썬으로 풀었기 때문에 is~()라는 메서드들을 이용해서 간단하게 해결했다. 파이썬이 아니라 다른 언어로 해결을 하려고 한다면 아스키코드표를 이용하면 될 것이다.

 

isupper()의 경우 문자가 65~90에 해당할 것이고, islower()의 경우에는 97~122에 해당할 것이다. 숫자의 경우 아스키코드 상으로는 48~57에 해당하게 되고, isspace()에 해당하는 빈 칸은 32에 해당하게 된다.

 

그리고 문제에서는 몇 개의 테스트 케이스가 주어진다고 정해지지 않았기 때문에 EOF 검사를 해줘야 한다. sys.stdin.readline()으로는 입력이 있었는지 None인지 확인하면 될 것이다.

이와 다르게 input()을 사용했다면, try ~ except 문으로 EOFError를 처리해주면 될 것이다.

 

주의해야 할 점은 테스트 케이스의 세 번째 예제를 통해 알 수 있듯이 입력에 '\n'도 space를 포함시키기 때문에 strip을 해줘야 하는데, lstrip()은 당연히 해주면 안 되고, rstrip()빈칸과 \n을 구분해야 한다. 따라서 rstrip('\n')으로 rstrip에 인자를 넘겨줌으로써 해당 값을 모두 제거해준다. 물론 \n으로 인자를 정의해주지 않으면 공백을 모두 제거하게 된다. 여기에서는 rstrip('\n')을 사용했지만, sys.stdin.readline()[:-1] 도 같은 의미로 사용할 수 있다.

 

import sys

while True:
    line = sys.stdin.readline().rstrip('\n')
    up, lo, sp, nu = 0, 0, 0, 0
    
    if not line:
        break
    for l in line:
        if l.isupper():
            up += 1
        elif l.islower():
            lo += 1
        elif l.isdigit():
            nu += 1
        elif l.isspace():
            sp += 1
    
    sys.stdout.write("{} {} {} {}\n".format(lo, up, nu, sp))

 

잘못된 점이나 부족한 점 지적해주시면 감사하겠습니다

728x90