Soft Talks

Online Judge Runtime Error (RE/RTE) 원인: I/O

Algorithmus 2022. 11. 27. 21:45

로컬 PC에서 돌려보면 테스트 케이스 답도 맞았는데 자꾸 RTE가 뜨는 경우, I/O 문제를 고려해 보자. OJ (Online Judge)는 입출력 형태가 다양해서 이를 잘 대응하는 방법을 알아야 여기서 RTE 해결하느라 많은 시간 안쓰고 본 문제 푸는데 집중해서 실력을 키울 수 있다. 나도 여러 번 삽질(?)을 해서 알아낸 것으로, 입력 유형별로 좋은 I/O를 정리해 보겠다. Python 3 기준이다.

input() 쓰지 말자

왜냐고? RTE가 잘 난다. 예를 들어, UVa 352 의 경우 다음과 같은 입력 자료를 다뤄야 한다. 전형적인 EOF 문제이다.

자료를 설명하면, 먼저 n by n 행렬의 n을 나타내는 숫자가 나오고 그 뒤에 행렬의 자료가 문자열로 입력된다. 그 다음 케이스가 같은 형태로 이어지다가 더 이상의 케이스가 없으면 입력이 종료되는 것이다. 어떻게 보면 가장 까다로운 형태의 입력이라 할 수 있다. 왜냐면, 총 테케가 몇 개인지도 없으며 (통상 아래 자료의 앞에 총 테케 갯수를 나타내는 숫자가 더 있다), 입력이 종료되었다는 것을 나타내는 신호도 없기 때문이다(테케가 다 주어지고 나면 마지막 줄에 0 이라던가 -1 같은 숫자를 준다). 결국 EOF, 즉 파일이 끝나면 알아서 입력도 끝내야 하는데, 그걸 어떻게 잡아내야 할지가 중요하다.

8
00010000
00100000
00010000
00100000
00100000
00000000
10000000
01000000
4
1111
1111
1111
1101
3
101
010
101

code 1은 input()을 쓴다. code 2 는 sys.stdin.readline()을 쓴다. 전자는 RTE를 낳을 가능성이 높다. 그러나 후자는 무리없이 AC를 도와줄 것이다.

# code 1
while True:
    line = input().strip()
    if line == '':  # EOF
        break

# code 2
import sys
while True:
    line = sys.stdin.readline().strip()
    if line == '':  # EOF
        break
        
# code 2' : for same type of lines
for LINE in sys.stdin:
    line = LINE.strip()

strip() 잊지 말자

위 code2 에서 strip()을 잊으면 그래프 문제를 포함해서 여러 경우에 큰 불상사가 생길 수 있다. 왜냐고? \n 같은 개행문자가 마치 하나의 값처럼 어느 변수의 한 셀에 입력이 되어 그것이 자기도 모르는 새에 어느 곳에 박혀 값으로 동작하다가 RTE를 낼 수 있기 때문이다.  strip() 하나 써 주는 게 귀찮아도 꼭 잊지 말고 써서 쓸데없는 오류의 가능성을 제거하자.

stackoverflow due to recursion

Python에서 dfs를 하다보면 오류가 날 수 있다. 그런데 왜 그런지 모르고 헤매다가 결국 많은 시간을 날린 경험이 있다. 오랜만에 OJ를 하다보면 그런 일이 있다. 꼭 기억하자. dfs와 sys.setrecursionlimit() 은 한 쌍이다.

import sys
sys.setrecursionlimit(10005)

def dfs(u):
    visited[u] = True
    for v in adj[u]:
        dfs(v)

뻔하지만 결코 가볍지 않은 교훈

기본이 무너지면 시간을 쓸데없는 데서 엄청나게 허비할 수 있다. 딱 저 code 2만 제대로 암기해도 몇 시간은 절약할 수 있기에, 나부터도 잊지 않으려고 이 글을 쓴다.

그리고, 왜 OJ가 이토록 다양한 I/O를 요구하는지 생각해보면, 결국 실제로도 코딩을 할 때 이 부분에 대해서 훈련이 제대로 되어 있지 않다면 이런 저런 라이브러리를 찾아야 하던지 하루 이틀 날리는 일이 생길 수 있기 때문이다. 컴퓨터에 일을 시키려면 I/O가 기본이다. 이 부분을 탄탄히 해두어야 그 다음 연산이 이뤄질 수 있는 것이다.

반응형

'Soft Talks' 카테고리의 다른 글

나는 왜 이 회사를 사랑하는가  (0) 2023.02.10
테크 업계 이직시장 리뷰  (2) 2023.01.10
면접 전에 꼭 할 일  (0) 2022.11.19
카카오 개발자 영입 합격수기  (2) 2022.10.03
오류노트  (0) 2022.05.11