문제
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)가 공백 하나를 사이로 두고 주어진다.
출력
각 가정이 성립할 때 제이지가 받을 상금을 원 단위의 정수로 한 줄에 하나씩 출력한다. 입력이 들어오는 순서대로 출력해야 한다.
내가 쓴 코드
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
//제이지가 상상력을 발휘하여 가정한 횟수
int t = sc.nextInt();
int sum = 0, sum1 = 0;
for(int i = 1; i <= t; i++){
int a = sc.nextInt(); //제 1회
int b = sc.nextInt(); //제 2회
if(a == 0){
sum = 0;
}else if(a == 1){
sum = 5000000;
}else if(2 <= a && a <= 3){
sum = 3000000;
}else if(4 <= a && a <= 6){
sum = 2000000;
}else if(7 <= a && a <= 10){
sum = 500000;
}else if(11 <= a && a <= 15){
sum = 300000;
}else if(16 <= a && a <= 21){
sum = 100000;
}else if(22 <= a && a <= 100){
sum = 0;
}
if(b == 0){
sum1 = 0;
}else if(b == 1){
sum1 = 5120000;
}else if(2 <= b && b <= 3){
sum1 = 2560000;
}else if(4 <= b && b <= 7){
sum1 = 1280000;
}else if(8 <= b && b <= 15){
sum1 = 640000;
}else if(16 <= b && b <= 31){
sum1 = 320000;
}else if(32 <= b && b <= 64){
sum1 = 0;
}
System.out.println(sum + sum1);
}
}
}
받은 답안 비교
import java.util.Scanner;
public class Main{
//get2017
static int get2017(int rank){
if(rank == 1){
return 5000000;
}else if(2 <= rank && rank <= 3){
return 3000000;
}else if(4 <= rank && rank <= 6){
return 2000000;
}else if(7 <= rank && rank <= 10){
return 500000;
}else if(11 <= rank && rank <= 15){
return 300000;
}else if(16 <= rank && rank <= 21){
return 100000;
}else {
return 0;
}
}
//get2018
static int get2018(int rank){
//1등 상금
int res = 5120000;
//start : 해당 상금에 대한 랭크의 시작점
//range : 해당 상금에 대한 랭크의 범위
int start = 1, range = 1;
if(rank == 1){
return res;
}else{
for(int i = 0; i < 4; i++){
//랭크의 시작점은 직전의 랭크 범위만큼 이동시킨다
start += range;
//범위는 점점 2배씩 즈가된다.
range *= 2;
//상금은 절반씩 줄어든다.
res /= 2;
if(start <= rank && rank < start + range){
return res;
}
}
}
return 0;
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
while(t-- > 0){
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println(get2017(a) + get2018(b));
}
}
}
나는 for문과 if문만을 사용하여 코드를 작성했다.
계속 어떻게 작성해야하나 고민하다가 하나하나 대입하기 적당한거같아서 그렇게 작성했다.
함수를 새로 만들어 그것을 대입시키는게 아직까진 어려운거같다. ㅠ
더 연습을 해야겠다.
'Coding Test > 백준' 카테고리의 다른 글
백준 13015. 별 찍기 - 23 (0) | 2021.03.11 |
---|---|
백준 14697. 방 배정하기 (0) | 2021.03.11 |
백준 10845. 큐 (0) | 2021.03.02 |
[21.01.25] 5_ 09085. 더하기 (0) | 2021.02.07 |
[21.01.25] 4_02576. 홀수 (0) | 2021.02.05 |