오늘의 오답 노트는 1152번입니다.
간단하게 문장 내의 단어의 개수를 출력하는 문제로 굉장히 쉬워보이는 문제인데요.
하지만 정답 비율은 무려 33.223%. 무언가 함정이 있다는 것을 알아버렸습니다.
자세히 마저 읽다보니, 예제 입력에 처음과 끝에 공백이 추가적으로 들어갈 수 있다는 것을 알아버렸습니다. 예제 입력 2를 보면 다른 출력과 다르게 앞에 공백이 있습니다. 예제 입력 3은 맨 뒤에 공백이 있구요.
따라서 저는 sys.stdin.readline().strip()을 통해 양 끝의 공백과 엔터를 지워주고, split(' ')을 통해 공백으로 단어를 구분해주기로 했습니다.
import sys
input = lambda:sys.stdin.readline().strip()
print(len(input().split(' ')))
하지만 결과는 틀렸습니다....
그래서 split() 공식문서를 좀 더 찾아보니
라고 하더군요.
즉 split()과 split(' ')는 다르다는 겁니다.
split()같은 경우는 공백이 연속적으로 있는 것과 상관 없이 안에 있는 값만을 리스트의 요소로 넣어서 반환하고요.
split(' ')의 경우는 중간에 값이 없으면 ''(공백) 자체가 리스트의 요소로 넣어져서 반환됩니다.
따라서, 제가 만든 코드는 공백만 입력으로 들어오면 0을 반환해야되는데 1을 반환해서 틀렸다는 것을 알아버렸습니다.
이제 문제를 파악했으니 해결해봅시다.
split()을 쓰면 " 공백이 연속적으로 있는 것과 상관 없이 안에 있는 값만을 리스트의 요소로 넣어서 반환한다."는 특성을 활용해 기존의 strip()과 split(' ') 대신에 split()만을 사용해 간단하게 코드를 작성할 수 있습니다.
import sys
print(len(sys.stdin.readline().split()))
sys.stdin.readline()을 통해 입력을 읽어주고요.
.split()을 통해 문자열을 단어 단위로 나눠서 list로 반환해줍니다.
마지막으로 len을 통해 해당 리스트의 개수를 반환합니다.
결과는,
성공!
오늘의 교훈
공식 문서를 정독하자.
참고 자료
https://docs.python.org/ko/3/library/stdtypes.html#str.split
'백준 > 오답노트' 카테고리의 다른 글
[백준 오답노트] 2563번 shallow copy vs deep copy, list comprehension (3) | 2024.11.08 |
---|