백준 15953번: 상금 헌터
by Jm Park
문제
2017년에 이어, 2018년에도 카카오 코드 페스티벌이 개최된다!
카카오 코드 페스티벌에서 빠질 수 없는 것은 바로 상금이다. 2017년에 개최된 제1회 코드 페스티벌에서는, 본선 진출자 100명 중 21명에게 아래와 같은 기준으로 상금을 부여하였다.
순위 | 상금 | 인원 |
---|---|---|
1등 | 500만원 | 1명 |
2등 | 300만원 | 2명 |
3등 | 200만원 | 3명 |
4등 | 50만원 | 4명 |
5등 | 30만원 | 5명 |
6등 | 10만원 | 6명 |
2018년에 개최될 제2회 코드 페스티벌에서는 상금의 규모가 확대되어, 본선 진출자 64명 중 31명에게 아래와 같은 기준으로 상금을 부여할 예정이다.
순위 | 상금 | 인원 |
---|---|---|
1등 | 512만원 | 1명 |
2등 | 256만원 | 2명 |
3등 | 128만원 | 4명 |
4등 | 64만원 | 8명 |
5등 | 32만원 | 16명 |
제이지는 자신이 코드 페스티벌에 출전하여 받을 수 있을 상금이 얼마인지 궁금해졌다. 그는 자신이 두 번의 코드 페스티벌 본선 대회에서 얻을 수 있을 총 상금이 얼마인지 알아보기 위해, 상상력을 발휘하여 아래와 같은 가정을 하였다.
-
제1회 코드 페스티벌 본선에 진출하여 a등(1 ≤ a ≤ 100)등을 하였다. 단, 진출하지 못했다면 a = 0으로 둔다.
-
제2회 코드 페스티벌 본선에 진출하여 b등(1 ≤ b ≤ 64)등을 할 것이다. 단, 진출하지 못했다면 b = 0으로 둔다.
제이지는 이러한 가정에 따라, 자신이 받을 수 있는 총 상금이 얼마인지를 알고 싶어한다.
입력
첫 번째 줄에 제이지가 상상력을 발휘하여 가정한 횟수 T(1 ≤ T ≤ 1,000)가 주어진다.
다음 T개 줄에는 한 줄에 하나씩 제이지가 해본 가정에 대한 정보가 주어진다. 각 줄에는 두 개의 음이 아닌 정수 a(0 ≤ a ≤ 100)와 b(0 ≤ b ≤ 64)가 공백 하나를 사이로 두고 주어진다.
출력
각 가정이 성립할 때 제이지가 받을 상금을 원 단위의 정수로 한 줄에 하나씩 출력한다. 입력이 들어오는 순서대로 출력해야 한다.
예제 입력/출력
입력 | 출력 |
---|---|
6 8 4 13 19 8 10 18 18 8 25 13 16 |
1780000 620000 1140000 420000 820000 620000 |
코드
#include <iostream>
using namespace std;
int main() {
int t, a, b, ans;
int reward_2017[] = { 0, 500,300,200,50,30,10 };
int reward_2018[] = { 0, 512,256,128,64,32 };
int people_2017[] = { 0, 1,3,6,10,15,21 };
int people_2018[] = { 0, 1,3,7,15,31 };
scanf("%d", &t);
while (t--) {
ans = 0; // 상금 금액 초기화
scanf("%d %d", &a, &b);
for (int i = 0; i < 6; i++) {
if (people_2017[i] < a && a <= people_2017[i + 1]) {
ans += reward_2017[i + 1];
break;
}
}
for (int i = 0; i < 5; i++) {
if (people_2018[i] < b && b <= people_2018[i + 1]) {
ans += reward_2018[i + 1];
break;
}
}
printf("%d\n", ans * 10000); // '원' 단위의 예상 상금 출력
}
return 0;
}
풀이
이 문제를 제일 간단하게 풀 수 있는 방법은 2017년, 2018년 각 배열을 만들어 해당 등수 안에 든 사람들의 index값에 상금을 다 저장해 두는 방식이다.
예 ) int prize_2017[21] = {0, 500, 300, 300, 200, 200, 200, 200, … , 10}
이렇게 만들면 prize_2017[a]값을 출력하면 바로 해당 등수의 상금이 된다.
위 코드는 2017년 21명, 2018년 31명 배열의 값을 일일이 입력하기 귀찮아서 다르게 만든 방법이다.
- reward_2017[], reward_2018[]: 상금
- people_2017[], people_2018[]: 등수에 해당하는 사람 수(누적)
예를 들어 a가 8일때, 8은 people_2017[3]=7 < 8 < people_2017[4]=15 이기 때문에 4등에 해당하는 상금을 받게 된다. 그렇다면 reward_2017[4]의 값을 더해주면 된다.
b도 마찬가지로 2018년을 그대로 하면 된다.
그리고 각각 reward_2017[] + people_2018[] 을 통해 2017년과 2018년 예상 상금 금액을 구하고 ‘원’ 단위이기 때문에 10000원을 곱해주면 된다.
본선에 들지 못하는 경우에 상금은 0원으로 출력하는데 이것은 상금을 저장하는 변수인 ans가 늘 0으로 초기화 되기 때문에 등수에 들지 못하면 0*10000인 0이 나와서 따로 처리할 필요가 없어진다.
Subscribe via RSS