일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- dirtyflag pattern
- 프로세스 상태
- SWEA
- Modern C++
- Silver
- trie
- Bronze
- level1
- two pointer
- 8-Puzzle
- BOJ
- PrefixSum
- knapsack Problem
- LEVEL2
- Zenject
- Euclidean
- 3D RPG
- programmers
- Flyweight Pattern
- algorithm
- effective C++
- Project
- solid 원칙
- Unity
- stack
- Gold
- 프로그래머스
- level3
- binary search
- BFS
Archives
- Today
- Total
Patrick's Devlog
[BOJ/C++] IF문 좀 대신 써줘(19637번) 본문
1. 개요
https://www.acmicpc.net/problem/19637
19637번: IF문 좀 대신 써줘
첫 번째 줄에는 칭호의 개수 N (1 ≤ N ≤ 105)과 칭호를 출력해야 하는 캐릭터들의 개수 M (1 ≤ M ≤ 105)이 빈칸을 사이에 두고 주어진다. (1 ≤ N, M ≤ 105) 두 번째 줄부터 N개의 줄에 각 칭
www.acmicpc.net
1-1. 설명
밀리는 전투력 시스템을 만들어, 캐릭터가 가진 전투력을 기준으로 칭호를 붙여주려 한다. 예를 들면 세 개 칭호가 존재하고 전투력에 따른 조건이다
if power <= 10000
print WEAK
else if power <= 100000
print NORMAL
else if power <= 1000000
print STRONG
혼자 게임 개발하느라 매우 바쁜 밀리를 대신해 캐릭터의 전투력에 맞는 칭호를 출력하는 프로그램을 작성한다.
1-2. 제한 사항
- 첫줄에 칭호의 개수 N과 칭호를 출력해야 하는 캐릭터 개수 M이 빈칸을 사이에 두고 주어짐
- N과 M은 1이상 100,000 이하 자연수
- 둘째 줄부터 N개 줄 각 칭호의 이름을 나타내는 길이 1 이상, 11 이하 영어 대문자로만 구성된 문자열이 주어짐
- 해당 칭호의 전투력 상한값을 나타내는 정수 또한 주어지며 이는 10^9 이하
- N+2번째 줄부터 M개 줄에는 각 캐릭터 전투력을 나타내는 음이아닌 정수가 주어짐
2. 구현
2-1. 풀이
단순히 반복문으로 풀면 시간 초과가 날것이 눈에 보였다. 이분 탐색을 통해서 풀면 될 것 같아, 이를 이용해 해결하였다. 여기서 명심해야할 점은 우리는 하나의 값을 찾는 것이 아닌, 범위를 찾는 것이므로 이 점에 유의하여 구현해야 한다. 단순히 값에 초점을 맞추다보니 자꾸 출력초과가 떠서 살짝 애를 먹었다.
2-2. 코드
#include <iostream>
#include <algorithm>
using namespace std;
constexpr size_t MAX_NUM = 100000;
struct Title {
int num;
string name;
};
Title titles[MAX_NUM];
int target;
Title binarySearch(int val, int first, int last);
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int N, M, num;
cin >> N >> M;
for (int i = 0; i < N; i++) {
cin >> titles[i].name >> titles[i].num;
}
for (int i = 0; i < M; i++) {
cin >> num;
Title result = binarySearch(num, 0, N - 1);
cout << result.name << "\n";
}
return 0;
}
Title binarySearch(int num, int first, int last) {
if (first <= last) {
int mid = (first + last) / 2;
if (num <= titles[mid].num) return binarySearch(num, first, mid - 1);
else return binarySearch(num, mid + 1, last);
}
else return titles[first];
}
'Algorithm > Algorithms Practice' 카테고리의 다른 글
[BOJ/C++] 최대 힙(11279번) (0) | 2022.12.08 |
---|---|
[BOJ/C++] 택배 배송(5972번) (0) | 2022.12.07 |
[BOJ/C++] 타노스(20310번) (0) | 2022.12.05 |
[BOJ/C++] 랭킹전 대기열(20006번) (0) | 2022.12.02 |
[BOJ/C++] 숫자고르기(2668번) (0) | 2022.12.01 |