https://www.acmicpc.net/problem/10816
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
1 초 | 256 MB | 96291 | 35973 | 25774 | 36.431% |
문제
숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 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=int(input())
arr = list(map(int,input().split()))
m=int(input())
check = list(map(int,input().split()))
def BS(e):
start = 0
end = m-1
while start <= end:
mid = (start+end)//2
if s_check[mid] < e:
start = mid + 1
elif s_check[mid] > e:
end = mid - 1
else:
return mid
return -1
ans = {}
for i in check:
ans[i] = 0
s_check = sorted(check)
for i in range(n):
idx = BS(arr[i])
if idx != -1:
ans[arr[i]] +=1
for i in check:
print(ans[i], end = ' ')
아래 코드는 어떤 사람이 set으로 풀길래 나도 풀어봤는데 저 코드가 더 쉽고 간략한데 시간복잡도도 더 적다.
알고리즘 풀다보면 set 자료구조가 활용할 곳이 은근 많은데 생각이 안나서 항상 놓친다.
n=int(input())
arr = list(map(int,input().split()))
m=int(input())
check = list(map(int,input().split()))
ans = {}
for i in check:
ans[i] = 0
set_check = set(check)
for i in range(n):
if arr[i] in set_check:
ans[arr[i]] +=1
for i in check:
print(ans[i], end = ' ')
문제 자체는 어렵지 않아서 설명 없이 패스.
구현 문제 많이 나오던데 구현 좀 풀어봐야겠다.
'알고리즘 > 이분탐색' 카테고리의 다른 글
[Python] 백준 2467 - 용액 (0) | 2023.02.03 |
---|---|
[Python] 백준 14003 - 가장 긴 증가하는 부분 수열 5 (0) | 2023.02.02 |
[Python] 백준 12015 - 가장 긴 증가하는 부분 수열 2 (0) | 2023.02.01 |