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 |