N개의 카드를 오름차순으로 정렬한 리스트 card에서
bisect라이브러리의 내장함수인 bisect_right와 bisect_left를 이용해서 각각의 숫자가 몇개씩 있는지 세고,
딕셔너리에 추가한 뒤 출력하는 방식을 생각했는데 자꾸 시간초과가 나왔다.
bisect_right(list, value)는 list에서 value가 들어갈 가장 오른쪽 위치를 알려주고
bisect_left(list, value)는 왼쪽 위치를 알려줘서
정렬된 list에 사용하면 오른쪽위치-왼쪽위치=list내에서 그 숫자의 개수가 된다.
그런데 생각해보니 굳이 다시 저장하고 끄집어낼 필요가 없는 거다.
그래서 딕셔너리를 쓰지 않고 그냥 바로 출력해버리니까 정답판정을 받았다.
import bisect
n = int(input())
card = sorted(map(int,input().split()))
m = int(input())
target = list(map(int, input().split()))
def cnt(arr,value):
return bisect.bisect_right(arr,value)-bisect.bisect_left(arr,value)
for t in target:
print(cnt(card,t),end=' ')
아래는 시간초과 받았던 코드들이다
import bisect
n = int(input())
card = list(map(int,input().split()))
m = int(input())
target = list(map(int, input().split()))
card.sort()
d = {}
for t in target:
if t in card:
d[t] = bisect.bisect_right(card,t)-bisect.bisect_left(card,t)
else:
d[t] = 0
print(' '.join(str(d[t])for t in target))
def bin_search(arr,target,start,end):
if start>end:
return 0
mid = (start+end)//2
if arr[mid]==target:
return arr[start:end+1].count(target)
elif arr[mid]>target:
return bin_search(arr,target,start,mid-1)
else:
return bin_search(arr,target,mid+1,end)
for t in target:
print(bin_search(card,t,0,len(card)-1),end=' ')
'Algorithm > [BOJ] - Python' 카테고리의 다른 글
[백준] 12015 : 가장 긴 증가하는 부분 수열 2 python (0) | 2023.09.23 |
---|---|
[백준] 2110 : 공유기 설치 python (0) | 2023.09.23 |
[백준] 17086 : 아기 상어 2 python (0) | 2023.09.11 |
[백준] 1743 : 음식물 피하기 python (0) | 2023.09.10 |
[백준] 7562 : 나이트의 이동 python (0) | 2023.09.10 |