Patrick's Devlog

[BOJ/C++] IF문 좀 대신 써줘(19637번) 본문

Study/Algorithms Practice

[BOJ/C++] IF문 좀 대신 써줘(19637번)

Patrick_ 2022. 12. 6. 15:54

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];
}

 

'Study > 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