봄기운이 완연하는 만우절이다.
오늘 공개된 두 번째 문제를 풀었다.
알고리즘 난이도 자체는 매우 쉬웠다만, 입출력에 난항을 겪어 풀이에 30분이 더 소요되었다.;;
뭐지..? 그래서 문자열이 몇 개 입력된다는 건가? N 을 입력받아야 할 것 같은데, 그런 건 없다.
백준에서는 stdin/out 을 기반으로 풀이가 이루어지는데, 이 구조를 잘 생각해보아야 한다.
…항상 입력의 마지막에는 개행(newline, ‘\n’)이 입력된다는 점이다.
이 점에 착안하여.. 마지막 문장이 텅 비어있다면 종료
하도록 해 풀었다.
풀이
import sys
input = sys.stdin.readline
def solution():
while True:
line = input().rstrip('\n') # <- 바로 이 부분이 문자열에 포함된 개행 문자를 잘라내는 것이다.
if not line: # 그냥 엔터를 했다면(입력의 마지막이라면) 종료한다.
break
lower_count = sum(1 for ch in line if ch.islower())
upper_count = sum(1 for ch in line if ch.isupper())
num_count = sum(1 for ch in line if ch.isdigit())
space_count = sum(1 for ch in line if ch.isspace())
print(lower_count, upper_count, num_count, space_count)
if __name__ == '__main__':
solution()
이 풀이를 보면, rstrip(’\n’) 을 하는 것을 볼 수 있다. 그냥 input() 을 사용했다면.. 개행이 뒤에 붙지 않는다.
입력을 조금 더 빠르게 처리하기 위해 sys.stdin.readline 을 사용하였고 이는 개행 문자를 포함해 입력을 받아버린다.
따라서 이를 적절히 처리하기 위해서는 rstrip(’\n’) 이 필요하다. 뭐 아래처럼 풀 수도 있다.
# 기존 로직 동일
input()[:-1]
# 기존 로직 동일
마무리
이 문제는 핵심 알고리즘 자체는 매우 간단하지만, 입출력 조건에서 처음 접하는 낮선 조건으로 시간을 소요하였다.
다양한 입/출력 조건을 제시하는 문제를 찾아보아야겠다.