백준 문제풀이 19637 IF문 좀 대신 써줘

Kim. K.S·2022년 1월 27일
0

boj 19637 : IF문 좀 대신 써줘

문제 주소: https://www.acmicpc.net/problem/19637

난이도: silver 3

1.문제설명

  • 캐릭터의 전투력에 따라, 칭호를 붙혀주려한다.
  • 칭호의 개수와, 그에 따른 전투력 기준이 주어질 때
  • 전투력을 입력받고, 칭호를 출력하는 코드를 만들어라
  • 한 캐릭터가 칭호를 여러개 받을 수 있을 땐 높은 칭호가 나오도록 만들어라

2.문제해결 아이디어.

  • 입력 개수를 보니깐 이진탐색으로 풀어야한다.
  • 그럼 어떤 변수를 이진탐색으로 찾을까?
  • 칭호의 정보가 담긴 리스트의 인덱스를 이진탐색으로 찾자.

3.문제접근법

tags = [input().split() for _ in range(N)] 
#칭호 N개에 대한 이름과 그에따른 전투력 기준을 리스트에 저장한다.
#입력은 오름차순으로 주어진다.
def print_tag(stat, tags):
    low = 0 #시작 인덱스
    high = len(tags) - 1 #끝 인덱스
    ans = 0 #나중에 return해줄 정답
    while low <= high: #이진탐색 시~작!
        mid = (low + high) // 2
        if int(tags[mid][1]) >= stat: 
            #만약에 중간값에 해당하는 칭호의 전투력 컷 보다 입력받은 전투력이 낮거나 같으면
            high = mid - 1 #끝 인덱스를 재설정해줌
            ans = mid# 같을 경우에 정답일지 모르니 일단 저장
        else: 
            low = mid + 1
    return ans

4.특별히 참고할 사항

  • 그냥 input으로 받으면 시간초과 난다.

5.코드구현

import sys

input = sys.stdin.readline
N, M = map(int, input().split())


def print_tag(stat, tags):
    low = 0
    high = len(tags) - 1
    ans = 0
    while low <= high:
        mid = (low + high) // 2
        if int(tags[mid][1]) >= stat:
            high = mid - 1
            ans = mid
        else:
            low = mid + 1
    return ans


tags = [input().split() for _ in range(N)]

for _ in range(M):
    stat = int(input().rstrip())
    ans = print_tag(stat, tags)
    print(tags[ans][0])
profile
시원한 맥주, 음악, 야구, 사진찍기를 좋아합니다.

0개의 댓글

관련 채용 정보