본문 바로가기
알고리즘

python 입력받기

by ujin2021 2020. 7. 29.

scpc 연습문제 108번(배드민턴) 문제를 풀었는데 python으로 짠 코드의 점수가 96점이 나왔다.

알고리즘은 맞는데(문제자체는 매우쉬움),, 입력받는 부분이 문제인가 싶어서 여러가지로 바꿔보았다. 이 문제를 통해 새롭게 알게된 것도 있고 코딩테스트시 유용한 정보도 있어 바로 포스팅!!

 

먼저 문제의 입력값이다.

3
ABAAABBAAA
ABBAAAAAAAABAAAAAAAABAABAA
BBBBBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAB

맨 첫줄은 테스트 케이스의 수, 각 줄은 경기에서 이긴 사람을 나열해 놓은 것이다.(A 이면 alice, B이면 bob이 이긴것)

21점을 얻은 사람이 이기는데, 각 테스트케이스가 playing(경기중), alice(alice의 승리), bob(bob의 승리) 중 어떤 상황인지 출력하는 문제이다.

 

처음에 scpc 코드 틀에서 테스트 케이스를 

import sys
inf = sys.stdin 
T = inf.readline()

 

이런 식으로 읽어온다. 한줄을 읽는 것인데 그래서 나는 입력받은 테스트 케이스 수만큼 for문을 돌려 각 경기결과를 inf.readline()으로 읽었다. 그런데 부분점수를 받은 것이다. 그래서 input()으로 바꾸어보았는데 만점을 받았다. 

input()이 sys.stdin.readline() 보다 처리속도가 빠른가? 싶어서 구글링을 해보았는데 웬걸 그 반대였다. 처리속도는

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

 

이렇다고 한다. 이 이슈는 이미 이전부터 있었다. https://www.acmicpc.net/board/view/19327
실제로 코드제출 시 시간초과가 떴을 때, input으로 readline으로 바꾸면 정답으로 나오는 경우가 있다!

 

럼 왜 readline을 사용했을 때 만점을 받지 못하는가? 또 혹시나 싶어 .strip()을 추가해보았다. 그랬더니 또 만점.

알고보니 readline()을 사용하면, 개행문자(\n)까지 포함되어 읽힌다. 이것에 따라 점수가 달라지는 이유는 내가 짠 알고리즘에 문제가 있었다.

(읽은 문자가 A와 같으면 a += 1 을, else면 b += 1을 했는데, 이 마지막 개행문자는 A와 같이 않으므로 B 점수에 합산이 되어 만점을 받지 못한것 같다.)

 

요약하자면, sys.stdin.readline()이 실행속도가 빠르고, 이것을 통해 읽었을 때는 개행문자까지 포함 된다는 것이다.

또 여러 입력받는 방법에 대해 찾아보았는데, 여러줄을 읽을 때도 readline()을 사용할 수 있다.

import sys 
inf = sys.stdin
n = input() 
a = [inf.readline() for i in range(n)]

(n을 받을 때도 readline()을 사용해 받을 수 있다.)

'알고리즘' 카테고리의 다른 글

[python]programmers-같은숫자는 싫어  (0) 2020.08.27
[python]programmers-2016년  (0) 2020.08.27
[python]직사각형 한점 찾기  (0) 2020.08.25
[python]programmers -K번째수  (0) 2020.08.25
java/python 진수변환  (0) 2020.07.31