본문 바로가기

알고리즘/백준

[Python] 백준 파이썬 10815 숫자 카드

https://www.acmicpc.net/problem/10815

 

10815번: 숫자 카드

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,

www.acmicpc.net

# 백준 10815 숫자 카드
import sys

n = int(sys.stdin.readline())
hand_card = list(map(int, sys.stdin.readline().split()))
m = int(sys.stdin.readline())
num = list(map(int, sys.stdin.readline().split()))

one_hot_list = [0] * m

for index, number in enumerate(num):
  if number in hand_card:
    one_hot_list[index] = 1

for i in one_hot_list:
  print(i, end=' ')

첫 시도 입니다.

확인할 숫자가 있는 리스트와 크기가 같고, 인수가 모두 0인 리스트를 만들고

상근이가 그 숫자를 가지고 있으면 0인 값을 1로 바꿔주는 방법을 사용했습니다.

근데 이렇게 푸니까 시간 초과가 뜹니다.

그래서 딕셔너리를 이용해 풀어봤더니 통과했습니다.

import sys

N = int(sys.stdin.readline())
hand_card = list(map(int, sys.stdin.readline().split()))
M = int(sys.stdin.readline())
num = list(map(int, sys.stdin.readline().split()))

num_dict = {}  
for i in range(len(hand_card)):
    num_dict[hand_card[i]] = 0 

for j in range(M):
    if num[j] not in num_dict:
        print(0, end=' ')
    else:
        print(1, end=' ')

위와 똑같지만 one_hot_list가 딕셔너리로 바뀌니 통과합니다. 역시 딕셔너리가 속도는 빠른 것 같습니다.

 

그리고 또 이것저것 하다가 알아낸건데

리스트를 이용해도 통과하는 풀이가 있었습니다.

import sys

n = int(sys.stdin.readline())
hand_card = set(map(int, sys.stdin.readline().split()))
# hand_card = list(map(int, sys.stdin.readline().split()))
m = int(sys.stdin.readline())
num = list(map(int, sys.stdin.readline().split()))

for i in num:
  if i in hand_card:
    print(1, end=' ')
  else:
    print(0, end=' ')

이건데 hand_card부분을 list로 하면 시간초과고 set으로 하면 통과입니다... 신기하네요

 

이번에 알게 된 것은

  1. 속도는 딕셔너리
  2. 만약 순서가 상관없고 중복이 있으면 안된다? -> 리스트보다는 집합(set)을 이용하기

정도가 되겠습니다.