본문 바로가기

온라인 코딩/기타(Other)

[백준] 17224번 APC는 왜 서브태스크 대회가 되었을까?

 

 

문제

 

소스코드

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include<iostream>
constexpr int MAX_N           = 101;
constexpr int MAX_L           = 51;
constexpr int SUB_TASK1       = 100;
constexpr int SUB_TASK2       = 40;
 
/*
N: 문제의 개수
L: 현정이의 역량
K: 대회중에 풀 수 있는 문제의 최대 개수
*/
int main() {
    int N, L, K, SUB1, SUB2;
    int easy_count{}, hard_count{};
    std::cin >> N >> L >> K;
 
    for (int i = 0; i < N; ++i) {
        std::cin >> SUB1 >> SUB2;
        if (L >= SUB2)
            ++hard_count;
        else {
            if (L >= SUB1)
                ++easy_count;
        }
    }
 
    //풀 수 있는 개수보다 많으면 모든 문제를 hard 문제를 풀 수 있기 때문에 K만큼 곱한다.
    int score{};
    if (hard_count > K) {
        score = K * (SUB_TASK1 + SUB_TASK2);
    }
 
    else {
        score += hard_count * (SUB_TASK1 + SUB_TASK2);
        K -= hard_count;
        if (easy_count > K) {
            score += K * SUB_TASK1;
        }
        else
            score += easy_count * SUB_TASK1;
    }
 
    std::cout << score << "\n";
}
 

후기

이 문제를 해결하기 위한 키워드는 2가지이다.

 

1. 최대한 높은 점수가 나와야 한다.

   현정이의 역량보다 작은 문제들은 hard_count, easy_count 변수를 통해 입력과 동시에 체크를 하였다.

 

2. 출력

   hard_count가 K(현정이가 풀 수 있는 최대 문제 개수) 보다 크다면 K개만큼 140(100+40)을 해서 출력하게 하였으며

   그 경우가 아니라면 K를 hard_count만큼 빼고 easy_count를 앞과 같은 방식으로 판단해서 출력하게 하였다.

    

 

처음에는 vector에 pair를 한 뒤 SUB2 점수를 기준으로 정렬 후 계산하게 하였는데 계속 100점이 나와서 이러한 방식으로 풀었더니 통과할 수 있었다. 코드는 100점 때에 비하면 리팩토링이 필요하다고 느낀다.

 

출처 및 레퍼런스

문제 링크:https://www.acmicpc.net/problem/17224

 

20.04.25

폰트 색상 및 소스코드->Color Scripter 변경