https://www.acmicpc.net/problem/1620
import sys
input = sys.stdin.readline
n,m = map(int, input().split())
d = {i:input().rstrip() for i in range(1,n+1)}
t = dict(map(reversed, d.items()))
for _ in range(m):
a = input().rstrip()
if not a[0].isdigit():
print(t[a])
else:
print(d[int(a)])
이번 문제는 어렵다기 보다는 꼼꼼해야 하는 문제입니다. 몇가지 방법들을 시도해봤는데 조금이라도 시간을 잡아먹는 방식은 바로 시간초과가 나버리도록 테스트 케이스가 주어져있어서 하나하나 잘 체크 해야합니다.
먼저 일반적으로 사용하는 input()은 사용하시면 시간초과가 납니다. 그래서 대충 입력이 좀 길다 싶으면 백준에서는 sys.stdin.readline을 쓰지 않으면 통과가 안되는 문제가 대부분인 것 같아요. 이번 문제도 ssr을 써줍시다(저는 input으로 짰다가 고친거라 input이라고 명명해줬습니다. 파이썬의 특징이기도 하죠). 여기서 주의해야할 점은 ssr은 기본적으로 입력의 맨마지막에 개행문자(\n)이 자동으로 붙습니다. 따라서 이걸 제거해주지 않으면 에러가 나요(저는 입력을 받는 단계에서 전부 제거했지만 출력할 때만 해줘도 문제 없을 것 같네요). 참고로 문자열 오른쪽의 공백을 지우는 명령어는 rstrip()입니다(왼쪽 공백 지우실 때는 lstrip을 쓰시면 됩니다).
또 key와 value를 바꿔서 딕셔너리를 하나 더 생성해주셔야 합니다. 딕셔너리의 특징인 key로 value에 접근할 때 시간복잡도가 O(1)인 것을 활용해야죠(d.items()로도 해봤는데 시간 초과가 나더라구요).
마지막으로 조건문에서 입력이 알파벳인지 숫자인지를 체크해주면 됩니다. isdigit이나 isalpha 둘 다 사용가능하니까 편한 것으로 사용하시면 됩니다(isdigit은 숫자일 경우 True를, isalpha는 알파벳일 경우 True를 반환합니다). 저는 어차피 문자와 숫자가 섞여 나오지 않으니까 첫 글자만 파악해도 상관없을 것이라고 생각해서 저렇게 짜봤습니다. 아마 모든 입력을 다 비교하는 것 보다 소요 시간 면에서 이득을 볼 수 있겠죠.
위에서 말씀드렸듯이 세세하게 신경을 써줘야하니 약간 귀찮은 문제였습니다. 특히 문자열 계통의 문제들이 이런 경우가 많은 것 같네요.
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ][Python]1764번 풀이 (0) | 2022.06.03 |
---|---|
[BOJ][Python]14916번 풀이 (0) | 2022.06.02 |
[BOJ][Python]5089번 정리 (0) | 2022.06.01 |
[BOJ][Python]13301번 풀이 (0) | 2022.06.01 |