728x90
🎴
https://level.goorm.io/exam/175909/%EC%B9%B4%EB%93%9C-%EB%AA%A8%EC%9C%BC%EA%B8%B0/quiz/1
시간 초과 난 코드
N, M = map(int, input().split())
all_cards = []
cards = []
ans = -1
def card():
global ans
complete = 0
for i in range(M):
all_cards.append(int(input()))
if len(set(all_cards)) == N and complete == 0:
ans = i + 1
complete = 1
card()
print(ans)
수정한 코드
N, M = map(int, input().split())
all_cards = set()
ans = -1
# 입력을 한 번에 받음
card_inputs = [int(input()) for _ in range(M)]
for i in range(M):
all_cards.add(card_inputs[i])
if len(all_cards) == N:
ans = i + 1
break
print(ans)
✍🏻 어디를 수정했냐면 ~
1. global(전역변수) 사용 X
실행 시간을 줄이는 데 큰 효과는 없으나, 코드 가독성 향상
2. 입력 방법 변경
기존: for문 돌면서 input() 여러 번 호출
수정 후: 한 번에 모든 입력을 받아 I/O 방법 최소화 ➡ 실행 시간 단축
여러 줄에 걸친 입력을 한 번에 받아서 처리하는 방법을 몰랐었다..!
잘 기억하고 넘어가기
card_inputs = [int(input()) for _ in range(M)]
3. 집합(set) 사용
기존: 리스트와 집합을 함께 사용(리스트에 값을 저장하고 후에 집합으로 변경하는 방식)
수정 후: 처음부터 집합으로 정의
4. 반복문 최적화
모든 카드를 수집하면 for문 즉시 종료(break) ➡ 실행 시간 단축
5. 불필요한 플래그 제거
기존: complete를 통해 모든 카드를 수집했는지 검사하는 방식
for문을 두 번 쓰고 싶지 않아서(숫자 입력받을 때랑, 검사할 때) 어쩔 수 없이 플래그를 썼는데 지저분하다고 생각했다.
한 번에 입력을 받는 방법을 사용하면, 플래그가 필요 없어진다.
'코딩테스트' 카테고리의 다른 글
[백준][Python] 2343 기타 레슨 (0) | 2024.07.05 |
---|---|
[백준][Python] 2805 나무 자르기 (0) | 2024.06.29 |
[백준][Python] 2785 체인 (0) | 2024.06.01 |
[백준][Python] 20125 쿠키의 신체 측정 (0) | 2024.05.27 |
[백준][Python] 7568 덩치 (0) | 2024.05.12 |