https://www.acmicpc.net/problem/19637
19637번: IF문 좀 대신 써줘
첫 번째 줄에는 칭호의 개수 N (1 ≤ N ≤ 105)과 칭호를 출력해야 하는 캐릭터들의 개수 M (1 ≤ M ≤ 105)이 빈칸을 사이에 두고 주어진다. (1 ≤ N, M ≤ 105) 두 번째 줄부터 N개의 줄에 각 칭
www.acmicpc.net
처음에는 아래와 같이 입력받은 숫자보다 큰수가 나오면 멈추게 완전 탐색 방법으로 구현을 했었다.
import sys
input=sys.stdin.readline
n,m=map(int,input().split())
s=[]
for _ in range(n):
a,b=input().split()
b = int(b)
s.append((a,b))
for _ in range(m):
t = int(input())
e=0
for i in s:
if t<=i[1]:
print(i[0])
e=1
break
if e==0:
print(s[-1][0])
당연하게도 시간초과가 났고 이분탐색을 이용해 풀었다. 이분탐색 부분에서 한가지 부분만 처리해주면 쉽게 풀 수 있는 문제였다.
import sys
input=sys.stdin.readline
def low_bound(t):#이분 탐색 함수.
st = 0
en = n-1
while st<en:
mid = (st+en)//2
if t<=s[mid][0]:
en = mid -1
else:
st = mid +1
if s[st][0]<t:#특수 처리해준 부분(안 해주면 예제 1번같은 경우에 틀림)
st+=1
return s[st][1]#그 숫자에 맞는 idx반환
n,m=map(int,input().split())
s=[]#숫자와 idx를 저장할 리스트
dp=[]#글을 저장할 리스트
for i in range(n):
a,b=input().split()
b = int(b)
dp.append(a)
s.append((b,i))#숫자와 idx저장 why?-> 이분 탐색을 위해 sort를 해줄것이기 때문
s.sort()#같은 숫자면 어떻하죠?->숫자(b)가 같으면 그 뒤에 i를 기준으로 정렬돼서 상관 없다.
for _ in range(m):
t = int(input())
print(dp[low_bound(t)])
++다시 생각해보니 내림차순으로 입력받아서 sort부분은 필요 없을거 같다.
'백준 파이썬 코딩' 카테고리의 다른 글
백준 20115 에너지 드링크 파이썬 (0) | 2022.10.27 |
---|---|
백준 3015 오아시스 재결합 파이썬 반례 설명 및 테스트케이스 공유 (0) | 2022.10.23 |
백준 14620 꽃길 파이썬 (1) | 2022.10.01 |
백준 16235 나무 재테크 파이썬 (1) | 2022.09.24 |
백준 1010 다리놓기 파이썬 (0) | 2022.09.24 |