https://www.acmicpc.net/problem/19637
19637번: IF문 좀 대신 써줘
첫 번째 줄에는 칭호의 개수 N (1 ≤ N ≤ 105)과 칭호를 출력해야 하는 캐릭터들의 개수 M (1 ≤ M ≤ 105)이 빈칸을 사이에 두고 주어진다. (1 ≤ N, M ≤ 105) 두 번째 줄부터 N개의 줄에 각 칭
www.acmicpc.net
이진 탐색 문제다.
주어지는 N과 M이 둘 다 10^5 까지의 범위기 때문에,
if문으로 전부 비교하게 되면 10^10으로 1초의 시간제한을 벗어나게 된다.
처음에 문제에 접근할 때는, 이진탐색으로 칭호를 기준으로 이진탐색하면서 ~칭호 이하의 개수만큼 ~칭호를 출력,
그 초과, 다음 이하의 개수만큼 ~칭호를 출력 하려고 생각했는데, 거꾸로 생각하면 더 편한 문제였다.
거꾸로 숫자를 주고 그 숫자가 어디 칭호의 범위 내에 들어가는지 이진탐색으로 찾은 뒤, 그 칭호에 맞는 결과를 출력하면 주어진 시간 내에 문제를 해결할 수 있다.
해결코드
import sys
n, m = map(int, sys.stdin.readline().rstrip().split())
title = []
for _ in range(n):
a, b = sys.stdin.readline().rstrip().split()
title.append((a, int(b)))
atk = []
for _ in range(m):
tmp = int(sys.stdin.readline().rstrip())
left, right = 0, n-1
mid = (left+right)//2
while left <= right:
if tmp > title[mid][1]:
left = mid+1
else:
right = mid-1
mid = (left+right)//2
mid = left
print(title[mid][0])
'항해99 > [항해99] 알고리즘' 카테고리의 다른 글
[BOJ] 9012 괄호 파이썬 (0) | 2024.01.15 |
---|---|
[BOJ]1002 터렛 파이썬 (0) | 2024.01.15 |
[BOJ] 10816 숫자카드 2 (0) | 2023.12.31 |
[항해99] DP - Dynamic Programming (0) | 2023.12.30 |
[항해99] 최단경로 찾기 - 플로이드 (0) | 2023.12.30 |