19637번: IF문 좀 대신 써줘
첫 번째 줄에는 칭호의 개수 N (1 ≤ N ≤ 105)과 칭호를 출력해야 하는 캐릭터들의 개수 M (1 ≤ M ≤ 105)이 빈칸을 사이에 두고 주어진다. (1 ≤ N, M ≤ 105) 두 번째 줄부터 N개의 줄에 각 칭
www.acmicpc.net
문제
게임 개발자인 밀리는 전투력 시스템을 만들어, 캐릭터가 가진 전투력을 기준으로 칭호를 붙여주려고 한다.
예를 들어, 전투력 10,000 이하의 캐릭터는 WEAK, 10,000 초과 그리고 100,000 이하의 캐릭터는 NORMAL, 100,000 초과 그리고 1,000,000 이하의 캐릭터는 STRONG 칭호를 붙여준다고 하자. 이를 IF문으로 작성한다면 아래와 같이 구현할 수 있다.
if power <= 10000
print WEAK
else if power <= 100000
print NORMAL
else if power <= 1000000
print STRONG
혼자서 게임을 개발하느라 매우 바쁜 밀리를 대신해서, 캐릭터의 전투력에 맞는 칭호를 출력하는 프로그램을 작성하자.
입력
첫 번째 줄에는 칭호의 개수 N (1 ≤ N ≤ 105)과 칭호를 출력해야 하는 캐릭터들의 개수 M (1 ≤ M ≤ 105)이 빈칸을 사이에 두고 주어진다. (1 ≤ N, M ≤ 105)
두 번째 줄부터 N개의 줄에 각 칭호의 이름을 나타내는 길이 1 이상, 11 이하의 영어 대문자로만 구성된 문자열과 해당 칭호의 전투력 상한값을 나타내는 109 이하의 음이 아닌 정수가 주어진다. 칭호는 전투력 상한값의 비내림차순으로 주어진다.
N + 2번째 줄부터 M개의 각 줄에는 캐릭터의 전투력을 나타내는 음이 아닌 정수가 주어진다. 해당하는 칭호가 없는 전투력은 입력으로 주어지지 않는다.
출력
M개의 줄에 걸쳐 캐릭터의 전투력에 맞는 칭호를 입력 순서대로 출력한다. 어떤 캐릭터의 전투력으로 출력할 수 있는 칭호가 여러 개인 경우 가장 먼저 입력된 칭호 하나만 출력한다.
코드
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
title = []
# 전투력 상한값의 비내림차순으로 주어짐
for _ in range(n):
title.append(input().split())
def find_title(character):
idx = 0
start, end = 0, len(title)-1
while start <= end:
mid = (start + end) // 2
if int(title[mid][1]) < character:
start = mid + 1
else:
idx = mid
end = mid - 1
return title[idx][0]
for _ in range(m):
print(find_title(int(input())))
전투력으로 출력할 수 있는 칭호가 여러 개인 경우 가장 먼저 입력된 칭호, 즉, 전투력 상한값이 가장 낮은 칭호를 출력해야하여야 한다. 그렇기 때문에 칭호와 전투력의 상한값을 저장해둔 2차원 배열을 이분탐색하여 칭호의 전투력 상한값보다 캐릭터의 전투력이 더 크다면 start를 mid + 1로 업데이트하여 다시 이분탐색한다. 그렇지 않다면 idx를 mid로 업데이트 해주고 end는 mid - 1로 업데이트하여 더 먼저 입력된 칭호 중 캐릭터가 가질 수 있는 칭호가 있는지 탐색한다.
파이썬의 bisect 라이브러리의 bisect_left() 함수를 이용하면 더 쉽게 풀이가 가능하다.
- bisect_left(배열, a)
: 배열에 a가 삽입되어야 하는 위치 인덱스를 리턴해준다. 배열에 이미 a와 같은 값이 있는 경우 a 위치의 왼쪽 인덱스를 리턴해준다.
주의할 점은 sys.stdin.readline으로 입력받지 않으면 이분탐색도 시간초과가 뜬다.
'문제풀이 > 이분탐색' 카테고리의 다른 글
[Python/파이썬] 백준 2805번 나무 자르기 (0) | 2023.03.09 |
---|---|
[Python/파이썬] 백준 11663번 선분 위의 점 (0) | 2023.03.08 |
[Python/파이썬] 백준 2512번 예산 (0) | 2023.03.07 |
[Python/파이썬] 백준 2110번 공유기 설치 (0) | 2022.09.28 |
[Python/파이썬] 백준 1654번 랜선 자르기 (0) | 2022.02.01 |
19637번: IF문 좀 대신 써줘
첫 번째 줄에는 칭호의 개수 N (1 ≤ N ≤ 105)과 칭호를 출력해야 하는 캐릭터들의 개수 M (1 ≤ M ≤ 105)이 빈칸을 사이에 두고 주어진다. (1 ≤ N, M ≤ 105) 두 번째 줄부터 N개의 줄에 각 칭
www.acmicpc.net
문제
게임 개발자인 밀리는 전투력 시스템을 만들어, 캐릭터가 가진 전투력을 기준으로 칭호를 붙여주려고 한다.
예를 들어, 전투력 10,000 이하의 캐릭터는 WEAK, 10,000 초과 그리고 100,000 이하의 캐릭터는 NORMAL, 100,000 초과 그리고 1,000,000 이하의 캐릭터는 STRONG 칭호를 붙여준다고 하자. 이를 IF문으로 작성한다면 아래와 같이 구현할 수 있다.
if power <= 10000 print WEAK else if power <= 100000 print NORMAL else if power <= 1000000 print STRONG
혼자서 게임을 개발하느라 매우 바쁜 밀리를 대신해서, 캐릭터의 전투력에 맞는 칭호를 출력하는 프로그램을 작성하자.
입력
첫 번째 줄에는 칭호의 개수 N (1 ≤ N ≤ 105)과 칭호를 출력해야 하는 캐릭터들의 개수 M (1 ≤ M ≤ 105)이 빈칸을 사이에 두고 주어진다. (1 ≤ N, M ≤ 105)
두 번째 줄부터 N개의 줄에 각 칭호의 이름을 나타내는 길이 1 이상, 11 이하의 영어 대문자로만 구성된 문자열과 해당 칭호의 전투력 상한값을 나타내는 109 이하의 음이 아닌 정수가 주어진다. 칭호는 전투력 상한값의 비내림차순으로 주어진다.
N + 2번째 줄부터 M개의 각 줄에는 캐릭터의 전투력을 나타내는 음이 아닌 정수가 주어진다. 해당하는 칭호가 없는 전투력은 입력으로 주어지지 않는다.
출력
M개의 줄에 걸쳐 캐릭터의 전투력에 맞는 칭호를 입력 순서대로 출력한다. 어떤 캐릭터의 전투력으로 출력할 수 있는 칭호가 여러 개인 경우 가장 먼저 입력된 칭호 하나만 출력한다.
코드
import sys input = sys.stdin.readline n, m = map(int, input().split()) title = [] # 전투력 상한값의 비내림차순으로 주어짐 for _ in range(n): title.append(input().split()) def find_title(character): idx = 0 start, end = 0, len(title)-1 while start <= end: mid = (start + end) // 2 if int(title[mid][1]) < character: start = mid + 1 else: idx = mid end = mid - 1 return title[idx][0] for _ in range(m): print(find_title(int(input())))
전투력으로 출력할 수 있는 칭호가 여러 개인 경우 가장 먼저 입력된 칭호, 즉, 전투력 상한값이 가장 낮은 칭호를 출력해야하여야 한다. 그렇기 때문에 칭호와 전투력의 상한값을 저장해둔 2차원 배열을 이분탐색하여 칭호의 전투력 상한값보다 캐릭터의 전투력이 더 크다면 start를 mid + 1로 업데이트하여 다시 이분탐색한다. 그렇지 않다면 idx를 mid로 업데이트 해주고 end는 mid - 1로 업데이트하여 더 먼저 입력된 칭호 중 캐릭터가 가질 수 있는 칭호가 있는지 탐색한다.
파이썬의 bisect 라이브러리의 bisect_left() 함수를 이용하면 더 쉽게 풀이가 가능하다.
- bisect_left(배열, a)
: 배열에 a가 삽입되어야 하는 위치 인덱스를 리턴해준다. 배열에 이미 a와 같은 값이 있는 경우 a 위치의 왼쪽 인덱스를 리턴해준다.
주의할 점은 sys.stdin.readline으로 입력받지 않으면 이분탐색도 시간초과가 뜬다.
'문제풀이 > 이분탐색' 카테고리의 다른 글
[Python/파이썬] 백준 2805번 나무 자르기 (0) | 2023.03.09 |
---|---|
[Python/파이썬] 백준 11663번 선분 위의 점 (0) | 2023.03.08 |
[Python/파이썬] 백준 2512번 예산 (0) | 2023.03.07 |
[Python/파이썬] 백준 2110번 공유기 설치 (0) | 2022.09.28 |
[Python/파이썬] 백준 1654번 랜선 자르기 (0) | 2022.02.01 |