파이썬에는 문자열을 입력받는 방법이 몇 가지 있습니다. 백준에서는 sys.stdin에 있는 readline을 많이 쓰는데요. 간단하게 알아보도록 하겠습니다.

 


 먼저 python의 sys.stdin에 있는 readline은 한 줄씩 입력을 받는데요. 아무 것도 없는 경우에 빈 배열을 돌려줍니다. 만약에 한 줄에 아무 것도 없고 개행만 있는 경우에는, 개행이 있기 때문에 이야기가 달라집니다. 예제를 보겠습니다.

 

  우리는 빈 배열이 리턴되면, 루프에서 빠져나가야 한다는 것을 알고 있습니다. while True: 로 계속 입력을 받습니다. 그런데 if not s: 이면 break를 겁니다. 배열의 경우 빈 배열일 때 해당 조건이 참이 되므로, 이 프로그램은 맞게 실행되는 것처럼 보입니다. 대부분의 백준 문제의 경우 요래 해도 별 상관은 없습니다.

 

 1.txt는 위와 같습니다. 중간에 안 보이는 문자들이 들어가 있는 줄들이 있는데요. 하나는 그냥 빈 문자열이고, 다른 하나는 탭 문자만 들어갔습니다.

 

 xxd로 보면 위와 같습니다. 0a가 개행인 부분이고요. 09는 탭 문자를 의미합니다.

 

 결과는 a, b, c, d만 입력받았습니다. 왜냐하면, sys.stdin.readline().strip() 때문에, 양 끝의 개행, 탭 등이 제거되었기 때문입니다. 아무런 인자가 제공되지 않았으므로 화이트 문자들이 제거되었고, 개행과 탭은 화이트 문자에 속합니다. 고로, 5번째 줄을 입력받고 함수 strip으로 처리했을 때 빈 문자열이 나올 수 밖에 없을 겁니다.

 

 

어떻게 고치면 될까요? 먼저 sys.stdin.readline()을 먼저 받습니다. 이 결과를 가지고 검사를 하면 됩니다. 만약에 파일의 끝이여서 더 이상 받을 수 없는 경우, if not (s := input()): 에 의해 break가 걸립니다. :=를 왈러스 연산자라 하는데요. 해당 연산자에 대한 간단한 설명은 링크 글을 참고하시면 됩니다.

 

[관련글]

파이썬 왈러스 연산자에 대해 간단하게 알아봅시다.

 

 다시 실행시켜 보니, 이번에는 의도한 대로 제대로 받았음을 알 수 있습니다. 정리하면 sys.stdin.readline()으로 입력을 계속 받습니다. 만약에 리턴 값이 빈 문자열이라면 반복문을 빠져나오게 하면 됩니다. 그런데 7번째 줄에 s = s.strip()이 들어갔습니다. 이는 왜 그럴까요?

 


  문자열에 저장되어 있는 문자들을 수로 변환시켜서 출력해 보겠습니다.

 

 그러면 요래 되는데요. 10은 개행을, 9는 탭을 의미합니다. 불필요한 개행이 붙었기 때문에 strip() 처리를 하지 않으면 개행이 한 번 더 출력되는 상황이 벌어지게 됩니다.

 

 s.strip()의 경우에는 어떨까요?

 

 이 경우 10, 9와 같은 양 끝에 붙은 white 문자들이 제거되게 됩니다. 만약에 개행 문자인 '\n'만 제거하려면 strip()에 인자를 넣어 버리면 됩니다.

 

 s.strip('\n')은 양 끝에 붙은 '\n'을 제거해 줍니다.

 

 다시 실행시켜 보면, 아까와는 다르게 10, 즉 양 끝에 붙은 개행문자만 제거되었음을 볼 수 있습니다.