[백준][python] 10816번: 숫자 카드2
10816번: 숫자 카드2
문제
숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 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개의 수에 대해서, 각 수가 적힌 숫자 카드를 상근이가 몇 개 가지고 있는지를 공백으로 구분해 출력한다.
첫번째 시도 . 이진탐색을 공부하기 이전(2022년 02월 4일)
N=int(input())
num=list(map(int,input().split()))
M=int(input())
compare=list(map(int,input().split()))
count=0
count_box=[]
#단순히 순차탐색으로 구현을함.
for i in compare:
for j in num:
if i==j:
count+=1
count_box.append(count)
count=0
print(' '.join(map(str,count_box)))
»output
Time error
🌝 Thinking
순차탐색을 이용하여 시간 초과가 나왔다. 그렇다면 어떻게 해결을 해야할 것인가?
두번째 시도 . 자료구조 후 재도전(2022년 02월 15일)
#이진탐색 알고리즘으로 해결.
#bisect 모듈을 활용하여 숫자를 정렬 후 같은 데이터숫자를 쉽게 구할 수 있다.
from bisect import bisect_left, bisect_right
N = int(input())
my_card = list(map(int,input().split()))
my_card.sort()
M = int(input())
card = list(map(int,input().split()))
for i in card:
print(bisect_right(my_card,i) - bisect_left(my_card,i),end=' ')
»input
10
6 3 2 10 10 10 -10 -10 7 3
8
10 9 -5 2 3 4 5 -10
»output
3 0 0 1 2 0 0 2
🌝 Thinking
sys모듈을 사용하지 않더라도 충분히 시간 초과없이 통과가 가능했다.
라이브러리를 활용하여 엄청 편하게 구현이 가능 했다.
💡 깨달은 점.
-
라이브러리를 활용한 것 또한 좋은 실력이라고 생각한다. 하지만 그 함수의 작동 알고리즘 또한 알고는 있자!
카드2문제를 풀때도 느꼈지만, 정말 알고리즘을 공부한 뒤로 대부분의 문제들이 쉽게 풀리는 듯 하다. (solved.ac 알고리즘 해당^^)
댓글남기기