728x90
https://www.acmicpc.net/problem/7795
7795번: 먹을 것인가 먹힐 것인가
심해에는 두 종류의 생명체 A와 B가 존재한다. A는 B를 먹는다. A는 자기보다 크기가 작은 먹이만 먹을 수 있다. 예를 들어, A의 크기가 {8, 1, 7, 3, 1}이고, B의 크기가 {3, 6, 1}인 경우에 A가 B를 먹을
www.acmicpc.net
접근법
- 이분 탐색을 통해 A의 원소가 B의 원소보다 큰 값의 경우의 수를 찾음.
- 이분 탐색을 통해 timeout이 나지 않도록 함.
def input_func():
a_num, b_num = map(int, input().split())
a_arr = list(map(int, input().split()))
b_arr = list(map(int, input().split()))
a_arr.sort()
b_arr.sort()
return a_arr, b_arr
def solution2(a_arr, b_arr):
count = 0
for a in a_arr:
tmp_count = 0
start, end = 0, len(b_arr) - 1
while start <= end:
mid = (start + end) // 2
if b_arr[mid] < a:
tmp_count = mid + 1
start = mid + 1
else:
end = mid - 1
count += tmp_count
print(count)
def main():
T = int(input())
for i in range(T):
a_arr, b_arr = input_func()
solution2(a_arr, b_arr)
if __name__ == '__main__':
main()
유의할 점 및 새로 배운 사항
1. bisect 라이브러리
bisect 라이브러리를 활용하면 이분 탐색을 쉽게 풀 수 있다.
처음 생각했던 알고리즘의 문제점(틀린이유)
더보기
try1
(1) 모든 원소를 탐색하니 timeout이 걸림 -> 이분 탐색 활용
def input_func():
a_num, b_num = map(int, input().split())
a_arr = list(map(int, input().split()))
b_arr = list(map(int, input().split()))
a_arr.sort()
b_arr.sort()
return a_arr, b_arr
def solution(a_arr, b_arr):
count = 0
for i in a_arr:
for j in b_arr:
if i > j:
count += 1
else:
break
print(count)
def main():
T = int(input())
for i in range(T):
a_arr, b_arr = input_func()
solution(a_arr, b_arr)
if __name__ == '__main__':
main()
사용된 알고리즘
정렬, 이분 탐색, 두 포인터
728x90
'study > 백준(BOJ)' 카테고리의 다른 글
[Python] 16234. 인구 이동 (0) | 2023.04.29 |
---|---|
[Python] 2110. 공유기 설치 (0) | 2023.04.27 |
[Python] 27211. 도넛 행성 (0) | 2023.04.25 |
[Python] 23351. 물 주기 (0) | 2023.04.25 |
[Python] 27922. 현대모비스 입사 프로젝트 (0) | 2023.04.19 |