본문 바로가기

Coding Test/백준

백준 15953. 상금헌터

문제

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