Notice
Recent Posts
Recent Comments
Link
250x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- vuejs
- 개발
- 동적계획법과최단거리역추적
- DART
- 백준
- 안드로이드스튜디오
- DFS
- 코드품앗이
- Python
- 분할정복
- Algorithm
- Vue
- 코딩테스트
- cos
- BAEKJOON
- 코테
- 파이썬
- 안드로이드
- C++
- Flutter
- 동적계획법
- DFS와BFS
- django
- 알고리즘
- android
- issue
- cos pro 1급
- AndroidStudio
- codingtest
- cos pro
Archives
- Today
- Total
Development Artist
[Baekjoon, Python] 10816번: 숫자 카드 2 본문
728x90
반응형
도입
백준 단계별 풀기에서 이분탐색 두 번째 문제이다.
풀이
1. N개의 정수 카드가 있는데, 집합 M의 요소들이 들어있는지 확인하는 문제. 해당 num이 들어왔을 때, N을 이분탐색을 하여서 있는 만큼 카운트하여 출력
2. binarySearch 함수를 만들어서 분할정복을 통해 해결. 하지만, 추가적으로 알게된 사실이지만, 이미 파이썬에서는 Collections 라이브러리의 Counter 함수가 해당 기능을 충분히 수행함.
코드 1
from sys import stdin, stdout
_ = stdin.readline() # Discard empty line
N = sorted(map(int,stdin.readline().split())) # N[-10 -10 2 3 3 6 7 10 10 10]
_ = stdin.readline() # Discard empty line
M = map(int,stdin.readline().split()) # M[10 9 -5 2 3 4 5 -10]
def binarySearch(num, N, start, end): # 이분탐색 함수
if start > end: # start가 end보다 큰 경우
return 0
m = (start+end)//2 # mid
if num == N[m]:
i, j = 1, 1
while m-i >= start: # mid기준 왼쪽
if N[m-i] != N[m]:
break
else: i += 1
while m+j <= end: # mid기준 오른쪽
if N[m+j] != N[m]:
break
else: j += 1
return i + j - 1
elif num < N[m]:
return binarySearch(num, N, start, m-1)
else:
return binarySearch(num, N, m+1, end)
n_dict = {} # 딕셔너리 자료형 선언
for n in N:
start = 0 # 0
end = len(N) - 1 # 9
if n not in n_dict: #
n_dict[n] = binarySearch(n, N, start, end)
print(' '.join(str(n_dict[x]) if x in n_dict else '0' for x in M )) # 구분자 ' '(공백)
코드 2
다른 방법을 서칭하는 중 Collections 라이브러리 안의 Counter 함수를 사용하면 더 빠른 속도를 가진 코드를 작성할 수 있음을 확인.
from sys import stdin
from collections import Counter
_ = stdin.readline()
N = stdin.readline().split()
_ = stdin.readline()
M = stdin.readline().split()
Count = Counter(N) #카운터 함수 사용
print(' '.join(f'{Count[m]}' if m in Count else '0' for m in M))
마무리
이분탐색의 알고리즘만 익혀두면, 이번 문제도 쉽게 해결 할 수 있다. 다만 놀랐던 것은 Collections 라이브러리를 사용함으로써, 시간을 많이 당길 수 있었다. goood
728x90
반응형
'Algorithm > Baekjoon' 카테고리의 다른 글
[Baekjoon, Python] 2805번: 나무 자르기 (0) | 2021.02.08 |
---|---|
[Baekjoon, Python] 1654번: 랜선 자르기 (0) | 2021.02.05 |
[Baekjoon, Python] 1920번: 수 찾기 (0) | 2021.02.03 |
[Baekjoon, C++] 6549번: 히스토그램에서 가장 큰 직사각형 (0) | 2021.02.01 |
[Baekjoon, C++] 11444번: 피보나치 수 6 (0) | 2021.01.29 |
Comments