[문제해결 - 자료구조] BOJ10816 / 숫자 카드 2 / 실버4 (Python, 파이썬)

인생,개발중·2024년 4월 6일
0

알고리즘 문제

목록 보기
14/17

백준10816 문제 보러가기

문제

숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 몇 개 가지고 있는지 구하는 프로그램을 작성하시오.

입력

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

셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 몇 개 가지고 있는 숫자 카드인지 구해야 할 M개의 정수가 주어지며, 이 수는 공백으로 구분되어져 있다. 이 수도 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다.

출력

첫째 줄에 입력으로 주어진 M개의 수에 대해서, 각 수가 적힌 숫자 카드를 상근이가 몇 개 가지고 있는지를 공백으로 구분해 출력한다.

예제 입력 1

10
6 3 2 10 10 10 -10 -10 7 3
8
10 9 -5 2 3 4 5 -10

예제 출력 1

3 0 0 1 2 0 0 2

문제 해결 과정

시간 초과 싸움

문제를 그저 해결'만' 하고자 하면, 쉽게 해결할 수 있다고 생각한다.
N개의 숫자 카드들을 List에 넣고, 확인하는 M개의 숫자들을 for 문으로 확인하면서 count 하면, 쉽게 해결할 수 있다 생각하여 처음에는 아래와 같이 코드를 짰다.

N = int(input())
card_list = list(map(int, input().split()))
M = int(input())
check_list = list(map(int, input().split()))
count = 0
result = []
for check in check_list :
    count = 0
    for card in card_list :
        if check == card : 
            count += 1 
    result.append(count)
    
print(*result)

아니나 다를까, 시간 초과가 떴다.
그리고 몇 번의 시도를 해도 계속 시간 초과가 떴다.

이분 탐색을 이용해도(내가 잘못 구현했는지는 모르겠지만), 계속해서 시간 초과가 떴다.
그래서 여러 블로그를 참고한 결과, 딕셔너리를 사용하기로 했다.
딕셔너리는 key, value로 저장이 되기 때문에 탐색하는데 O(1)만이 걸리기 때문에 (최악의 경우 O(n)), 시간 초과를 해결할 수 있을 것이라고 생각했다.

일단 'card의 숫자들 : count 값' 형식으로 딕셔너리에 저장하고 찾으면 된다는 생각을 했다.
따라서 코드는 다음과 같다.

import sys
input = sys.stdin.readline

N = int(input())
cards = list(map(int, input().split()))
M = int(input())
candidate = list(map(int, input().split()))

count = {}
for card in cards :
    if card in count :
        count[card] += 1
    else :
        count[card] = 1
        
for target in candidate :
    result = count.get(target)
    if result == None :
        print(0, end=" ")
    else : print(result, end=" ")
    
profile
There are many things in the world that I want to do

0개의 댓글