10816 숫자 카드2
업데이트:
1. 문제
문제는 링크에 들어가면 있다.
2. 정답 코드
문제의 내 정답 코드는 다음과 같다.
import sys
read = sys.stdin.readline
N = int(read())
N_list = list(map(int,read().split()))
M = int(read())
M_list = list(map(int,read().split()))
plut_list = [0]*10000001
minus_list = [0]*10000001
for n in N_list :
if n >= 0 :
plut_list[n] += 1
else :
minus_list[-1*n] += 1
for m in M_list :
if m >= 0 :
print(plut_list[m],end=' ')
else :
print(minus_list[-1*m],end=' ')
3. 문제 풀이
이 문제는 계수정렬같은 느낌을 사용하면 쉽게 풀리는 문제인데.. 내가 너무 어렵게 생각한 것 같다.. 이진 탐색으로 풀려고 노력하면서 1시간을 날렸는데.. 생각을 바꿔서 위 코드를 생각해내니 5분도 걸리지 않음.. 너무 어렵게 풀려고 하지 말자ㅜ
주어지는 N의 개수와 M의 개수가 50만개밖에 되지 않으므로 for문을 2개를 따로 돌려도 최대 100만번의 반복문밖에 실행되지 않기 때문에 위 처럼 코드를 구성하게 되었다. 하나씩 살펴보면서 해당 값의 list를 카운트하면 M list에서 나올 숫자를 index로 활용하여 간단히 답을 구할 수 있다.