doistory

[BOJ][Python] 백준2743번: 단어 길이 재기 / Python에서 input() 대신 sys.stdin.readline() 사용시 주의점 본문

[ 공부중 ]/코딩테스트

[BOJ][Python] 백준2743번: 단어 길이 재기 / Python에서 input() 대신 sys.stdin.readline() 사용시 주의점

떡볶이최고 2023. 12. 28. 09:33

문제 출처

 

2743번: 단어 길이 재기

알파벳으로만 이루어진 단어를 입력받아, 그 길이를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

오늘 문제를 풀면서 간단한 입력이지만 input() 대신 sys.stdin.readline()을 사용해보기로 했다.

어제 파이썬으로 코딩테스트를 준비하는 전공자분이 알려주신 방법이다. 

 

input() vs. sys.std.readline()

간단한 입력의 경우 그냥 input()을 사용해도 무방하지만, 위 둘은 입출력 속도에서 차이가 난다.

입출력 속도 비교는 아래와 같다.

sys.stdin.readline()   >   raw_input()   >   input()

따라서 input() 보다 sys.stdin.readline() 사용을 권장받았다.그래서 문제를 풀때 사용 해보았다.

 

백준2743번 문제 풀이

사실 이 문제는정말 간단하고 쉬운 문제였다.

그런데 vscode에서 실행시에 input()으로는 잘 작동하는데,,, sys.stdin.readline() 는 같은 단어를 쓰더라도 오작동했다.

a = input()
print(len(a))

입력: apple

결과: 5 

input()을 사용해서 입력을 받고 apple 을 입력하니 글자수는 아래처럼 5개로 제대로 출력 되었다.

 

그러나,, 아래에서 문제가 발생했다.

import sys
a = sys.stdin.readline()
print(len(a))

입력: apple

결과: 6

sys.stdin.readline()로 인풋을 받고 apple을 입력하니 6이 나와버린다,,ㅠ

 

아직 초보라서,,문법이 틀린줄 알고 이것저것 고쳐봐도 계속 틀렸다. (그와중에 java로 2번이나 잘못내서 에러ㅋㅋ)

 

sys.std.readline() 사용시 주의할 점

원인은sys.stdin.readline()은 문장 맨 끝의 개행 문자를 포함하여 반환해준다는 점 때문이었다. 

내가 입력한 apple을 단순히 apple로 받은게 아니었다.

입력에 사용한 엔터로 인하여 맨 끝에 줄바꿈이 들어가서 apple\n 이 되는것이다.

 

그래서 print(len('apple')) 하면 6글자라고 하는 것!

for문을 돌려서 확인해보자.

import sys
a = sys.stdin.readline()
for x in a:
    print(list(x))

 

 

 

 

정말 \n까지 포함해서 6개가 맞다! 

이 과정에서 \n은 또 두글자가 아니라 하나로 인식한다는 점도 새로 알게됐다.

 

 

 

 

정답코드

sys.std.readline() 사용시 len() 함수 오작동 해결방법

맨 끝의 개행문자를 버리면 된다.

sys.stdin.readline()뒤에 .rstrip()을 추가해주면 해결된다.

# 2743번 정답
import sys
a = sys.stdin.readline().rstrip()
print(len(a))

위와같이 답을 입력하면 정답처리된다.

 

 

똑같이 apple 이라고 입력해보면 5글자로 정상적으로 출력된다.

 

다시 for문을 돌려 확인해봐도

 

 

 

 

맨 끝의 개행문자 \n 은 사라지고 문자열만 확인된다 :)

 

 

 

 

 

정말,,,사소한 것이지만 아직 모든것이 새롭고 낯설기 때문에 이렇게 조금씩 배워가는 단계이다.

GOSU  들에겐 별 것도 아닌 문제라고 생각할 수 있지만

따라서 누군가도 나처럼 처음 코딩을 접하고 어려움을 겪을수도 있는 부분이라고 생각해서,, 기록해둔다 ㅎㅎ