코딩테스트

[goorm level] 카드 모으기

yeeejji 2024. 6. 13. 18:02
728x90

기초트레이닝 레벨 2

🎴

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문을 두 번 쓰고 싶지 않아서(숫자 입력받을 때랑, 검사할 때) 어쩔 수 없이 플래그를 썼는데 지저분하다고 생각했다.

한 번에 입력을 받는 방법을 사용하면, 플래그가 필요 없어진다.