알고리즘 공부(C++)

백준 19637 IF문 좀 대신 써줘 - 파이썬

혀니리리 2022. 9. 7. 10:21
728x90

19637번: IF문 좀 대신 써줘 (acmicpc.net)

 

19637번: IF문 좀 대신 써줘

첫 번째 줄에는 칭호의 개수 N (1 ≤ N ≤ 105)과 칭호를 출력해야 하는 캐릭터들의 개수 M (1 ≤ M ≤ 105)이 빈칸을 사이에 두고 주어진다. (1 ≤ N, M ≤ 105) 두 번째 줄부터 N개의 줄에 각 칭

www.acmicpc.net

이분탐색.. 잘 해오고있었는데

갑자기 뙇 어려운 문제 봉착..

 

근데 자꾸 시간초과가 뜨는것임 ;; 이분탐색으로 했는데도 .....

그래서 찾아보니 따로 함수를 만들고 조건에 해당될 떄만 불러오는게.. 아무래도 시간을 덜 쓰는듯 싶다.

import sys
N, M = map(int, sys.stdin.readline().split())
rank = [sys.stdin.readline().split() for _ in range(N)]
def bs(rank, cnt):
    start, end = 0, len(rank) - 1
    res = 0
    while start <= end:
        mid = (start + end) // 2
        if int(rank[mid][1]) >= cnt:
            end = mid - 1
            res = mid
        else:
            start = mid + 1 
    return res
for i in range(M):
    cnt = int(sys.stdin.readline())
    print(rank[bs(rank, cnt)][0])

이것이 정답 코드인데...

우리가 설정하고싶은 등급들의 정보를 이차원 배열로 만들고

이분 탐색에서 이 배열들의 1인덱스들을 탐색할 목적으로 돌려가면서

result 는 rank[mid][1]이 cnt보다 크거나 같을때마다 mid로 초기화를 해주면

마지막에 이 if문에 도달했을 때의 mid값이 곧 우리가 구하고자 하는 rank이므로 그때 출력해주면 된다.

728x90