set는 in 확인이 왜 이렇게 빠른가.
그렇게 수업시간에 자주 나오는 해시를 활용하기 때문이다.
아니면 in 확인이 저렇게 빠른게 불가능하다.
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
seen = set()
flag = False
for i in range(1, M+1):
seen.add(int(input()))
if len(seen) == N:
flag = True
break
print(i) if flag else print("-1")
몇 가지 코멘트:
1. flag 없이도 되긴 해 — 지금도 완벽히 맞는데, break로 빠졌는지 아닌지를 굳이 flag 안 쓰고 len(seen)으로 바로 판단할 수도 있어:
python
print(iiflen(seen)== Nelse-1)
루프 끝나고 seen이 N개면 채운 거(그때 i가 답), 아니면 -1. flag 변수 하나 줄어. 근데 flag 쓴 것도 명시적이라 나쁘지 않아 — 취향이야.
2. 미묘한 엣지 케이스 하나 — print(i)에서 i를 쓰는데, 만약 M이 0이면 for 루프가 한 번도 안 돌아서 i가 정의 안 돼 → NameError. 근데 이 문제는 제약이 1 ≤ N, M이라 M이 최소 1이야. 그래서 실제론 안 터져. 다만 "루프 변수를 루프 밖에서 쓰는" 패턴은 이런 위험이 있다는 것만 알아둬. 위 1번 방식(len(seen)으로 판단)은 이 위험도 없어서 더 안전한 습관이야.
3. print(i) if flag else print("-1") — 동작은 맞는데, 이건 "print를 하는 것 자체를 삼항으로 고른" 거라 살짝 특이해. 보통은 출력할 값을 고르고 print는 한 번만 써:
python
print(iif flagelse-1)
결과 같아. 이게 더 흔한 스타일이야. (-1을 문자열 "-1"로 안 해도 돼 — 정수로 출력하면 똑같이 -1 찍혀.)
세 개 다 "틀린 걸 고치는" 게 아니라 "더 깔끔하게" 수준이야. 지금 코드 제출해도 통과해. 정리하면 이 정도:
python
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
seen = set()
for i in range(1, M + 1):
seen.add(int(input()))
if len(seen) == N:
break
print(i if len(seen) == N else -1)
잘 풀었어. set 골라서 in/len O(1)로 처리한 게 이 문제 핵심이었는데 거기 정확히 도달했고, 실시간 체크로 최소 장수 뽑는 것도 스스로 고쳤어.