문제
숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 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. 이분탐색을 진행하는 함수를 제작해 그것을 이용해 프린트를 하거나
2. 딕셔너리 자체만으로 이용해 바로 프린트하는 방법이 있었다.
* 나의 코드 1
import sys
N = int(sys.stdin.readline())
N_s = sorted(list(map(int, sys.stdin.readline().split())))
M = int(sys.stdin.readline())
M_s = list(map(int, sys.stdin.readline().split()))
dic = {}
for n in N_s:
if n in dic:
dic[n] += 1
else:
dic[n] = 1
def binary(m, N_s, start, end):
if start > end:
return 0
mid = (start + end)//2
if m == N_s[mid]:
return dic[m]
elif m < N_s[mid]:
return binary(m, N_s, start, mid-1)
else:
return binary(m, N_s, mid+1, end)
for m in M_s:
print(binary(m, N_s, 0, len(N_s)-1), end=' ')
* 나의 코드 2
import sys
N = int(sys.stdin.readline())
N_s = list(map(int, sys.stdin.readline().split()))
M = int(sys.stdin.readline())
M_s = list(map(int, sys.stdin.readline().split()))
dic = {}
for n in N_s:
if n in dic:
dic[n] += 1
else:
dic[n] = 1
for m in M_s:
if m in dic:
print(dic[m], end=' ')
else:
print(0, end=' ')
1번은 이분탐색 진행을 위해 정렬된 리스트로 상근이가 가진 카드를 받았다.
2번은 이분탐색을 하지않고 딕셔너리에 저장된 정보를 토대로 바로 출력해주었다.
속도자체는 2번이 빨랐으나 1번이 좀 더 직관적인 코드라고 생각되었다.
*핵심 사항
{ 키 : 밸류 } 형태의 '딕셔너리'는 탐색하는데 드는 시간이 리스트를 일일이 탐색하는 것보다 적다.
'코딩테스트 > 백준' 카테고리의 다른 글
5. 백준 17219 (실버4) : 비밀번호 찾기 _ python풀이 (0) | 2024.08.13 |
---|---|
4. 백준 1764 (실버4) : 듣보잡 _ python풀이 (0) | 2024.08.10 |
3. 백준 1920 (실버4) : 수 찾기 _ python풀이 (0) | 2024.08.09 |
1. 백준 10828 (실버4) : 스택 _ python풀이 (0) | 2024.08.07 |
너무 오래 쉰 코드문제풀이 (0) | 2024.08.06 |