파이썬 알고리즘 기본기 EOF(End of File) 배우기

1. 문제

 

10820번: 문자열 분석 (acmicpc.net)

 

10820번: 문자열 분석

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

www.acmicpc.net

 

2. 풀이

 

주어진 입력의 끝을 모를때, 어떻게 입력의 끝을 알고 문제를 풀 수 있을까?

 

input파일을 프로그램이 읽어들이는데, 더 이상 읽을게 없을때 올바르게 프로그램을 종료할줄 알아야한다.

 

 

파이썬에서 한줄씩 입력을 받는 방법은 대표적으로 2가지가 있겠다

 

첫번째는 input()이고 두번째는 sys.stdin.readline()

 

input()은 한줄을 읽을때, 개행문자를 제거하고 한줄을 읽어서 문자열로 return하며

 

input()은 파일의 끝에 도달하면, EOFError를 발생시킨다.

 

따라서 무한 반복 while문을 try로 돌다가 파일의 끝을 읽을때 자연스럽게 EOFError를 발생시키므로 except로 반복문을 탈출하면 된다

 

while 1:
    
    try:

        s = input()

        answer = [0,0,0,0]

        for c in s:
            
            if c.islower():
                
                answer[0] += 1
            
            elif c.isupper():
                
                answer[1] += 1
            
            elif c.isdigit():
                
                answer[2] += 1
            
            elif c == ' ':
                
                answer[3] += 1

        print(*answer)
    
    except:
        
        break

 

 

실제로 ctrl+d로 강제로 EOF 일으키면 EOFError가 일어남

 

 

그런데 input()은 속도가 느릴 수 있어서 반드시 sys.stdin.readline()을 쓰고싶다면...?

 

sys.stdin.readline()은 한 줄을 읽을때, 개행문자 \n을 같이 읽어오므로,

문자열 그 자체로 사용할때는 반드시 rstrip()으로 개행문자를 제거하는게 중요하다

 

또한 EOF에 도달하면 input()과는 다르게 에러를 발생시키지 않고 빈 문자열을 반환한다

 

from sys import stdin

while 1:
    
    s = stdin.readline()
    
    if s == '':
        
        break
    
    else:
        
        answer = [0,0,0,0]

        for c in s:

            if c.islower():

                answer[0] += 1

            elif c.isupper():

                answer[1] += 1

            elif c.isdigit():

                answer[2] += 1

            elif c == ' ':

                answer[3] += 1

        print(*answer)

 

실제로 EOF를 읽어보면.. 빈 문자열이 나온다

 

 

 

 

그리고 개행문자를 읽어들이는 sys.stdin.readline()과 그렇지 않는 input()의 차이

 

 

 

브론즈는 쉽다고 생각해서 안풀었더니.. 기본기가 생각보다 많이 부족하네..??

 

 

참조

 

[TIL] #5. sys.stdin.readline() (tistory.com)

 

[TIL] #5. sys.stdin.readline()

입력을 받는 방법 알고리즘 문제를 풀다 보면 문제에서 주어진 입력을 받아 처리해야 하는 경우가 많다. Python의 경우 입력을 받을 수 있는 방법이 대표적으로 2가지가 있는데 input() 과 sys.stdin.rea

hyun0k.tistory.com

 

 

[BOJ] 입출력에서 readline()과 input()의 EOF 입력시 차이점 (tistory.com)

 

[BOJ] 입출력에서 readline()과 input()의 EOF 입력시 차이점

BOJ 내 Q&A의 설명은 다음과 같다 이 문제의 목적은 문자열을 올바르게 입력받고 파일의 끝(EOF)을 올바르게 판단하는 법을 연습하는 것입니다. 총 몇 줄이 주어진다 등의 정보는 절대 입력으로 주

joewithtech.tistory.com

 

 

TAGS.

Comments