• n * m이 10^10이기 때문에, 이중 포문은 사용할 수 없음
  • 시간 복잡도를 줄이면서 탐색할 수 있는 방식 → 이진 탐색

  • 이진 탐색을 위한 (레벨, 능력치) 정보를 담을 배열 선언

    • 입력으로 받음
    • 중복 제거를 위한 로직 추가
  • m개의 for문을 돌면서 입력으로 받은 능력치에 대한 level을 이진탐색

  • 이때, left가 해당 조건을 만족하는 첫 인덱스이기 때문에 left로 출력

    n, m = map(int, input().split())
    data = []
    for _ in range(n):
        level, value = input().split()
        value = int(value)
        if data and data[-1][1] == value:
            continue
        
        data.append(((level,value)))
    
    for _ in range(m):
        
        power = int(input())
        
        left = 0
        right = len(data) - 1
        
        while left<=right:
            
            mid = (left+right) // 2
            
            if data[mid][1] >= power:
                right = mid - 1
            else:
                left = mid +1
        
        
        print(data[left][0])
    
        
    
  • 입력의 시간 단축을 위해 sys 임포트

    import sys
    
    n, m = map(int, sys.stdin.readline().split())
    data = []
    for _ in range(n):
        level, value = sys.stdin.readline().split()
        value = int(value)
        if data and data[-1][1] == value:
            continue
        
        data.append(((level,value)))
    
    for _ in range(m):
        
        power = int(sys.stdin.readline())
        
        left = 0
        right = len(data) - 1
        
        while left<=right:
            
            mid = (left+right) // 2
            
            if data[mid][1] >= power:
                right = mid - 1
            else:
                left = mid +1
        
        
        print(data[left][0])