ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 20413번: MVP 다이아몬드 (Easy) (Python/Java)
    Algorithm/Algorithm Problem 2022. 1. 6. 21:12

    https://www.acmicpc.net/problem/20413

     

    20413번: MVP 다이아몬드 (Easy)

    입력된 MVP 등급을 달성하기 위한 최대 누적 과금액을 만원 단위로 출력한다.

    www.acmicpc.net

     

     

     

    접근


    누적 결제 금액이 최대가 되려면 너무 당연하게도 매번 결제할 때마다 결제할 수 있는 최대의 금액을 결제해야 한다. 첫 번째 달부터 현재 결제할 수 있는 금액이 얼마인지 확인하고 거기에 맞춰 최대 결제 금액을 맞춰주면 된다.

     

    예제를 통해 설명해보겠다. 문제에 본격적으로 들어가기 앞서 주어진 조건들을 사용하기 쉽게 배열로 만들었다. 실버, 골드, 플레티넘, 다이아의 기준 금액은 30, 60, 90, 150이다. 이를 배열에 순서대로 넣어줬다. 상민이의 등급은 'BSG'이다. 이 또한 이용하기 쉽게 각각 숫자로 바꿔 리스트에 넣어줬다. (B는 0, S는 1과 같이 순서대로)

     

    이제 첫 달부터 확인해보자. 상민이는. 첫 번째 달에 'B' 등급을 받았다. 브론즈 등급은 0 이상, 29 이하 범위를 가지고 있다. 그렇다면 이번 달에 최대로 결제할 수 있는 금액은 29만 원이다. 그리고 이번 달에 결제한 금액을 다음 달과 비교하기 위하여 따로 저장해둔다. 다음 달을 살펴보자. 상민이는 'S' 등급을 받았다. 실버 등급은 30 이상, 89 이하 범위를 가지고 있다. 지난달에 29만 원을 결제했고, 해당 금액은 이번 달까지 포함되니 이번 달에는 89만 원을 넘지 않게 60만 원을 결제할 수 있다. 이런 식으로 끝까지 반복해주면 최대 결제 금액을 찾을 수 있다.

     

    다만 이렇게만 푼다면 정답이 나올 수 없다. 왜냐면 'D'등급은 이전달 금액과 상관없이 최댓값(이 예제에서는 150)을 결제할 수 있기 때문이다. 만약 다이아 등급이 나온다면 이전 결제 금액은 신경 쓰지 않고 무조건 다이아 등급의 상한선을 결제한다고 처리한다. 이때 결제 금액 비교를 위한 저장을 따로 하지 않아도 된다. 문제 조건에 따르면 상민이가 한번 달성한 MVP 등급은 줄어들지 않는다고 한다. 즉, 한번 다이아 등급이 나오면 그 이후부터는 무조건 다이아 등급만 나온다. 때문에 그 이후부터는 따로 이전 금액과 비교할 필요 없이 그냥 다이아 등급의 상한선을 계속 더해주면 된다. 다들 나중에 후회하지 말고 '그 게임'에 과소비하는 일을 줄이도록 하자.

     

     

     

    풀이


    Python

    month = int(input())
    silver, gold, platinum, diamond = map(int, (input()).split())
    payList = [silver, gold, platinum, diamond]
    
    gradeList = []
    grade = input()
    for i in range(month):
        if grade[i] == "B":
            gradeList.append(0)
        elif grade[i] == "S":
            gradeList.append(1)
        elif grade[i] == "G":
            gradeList.append(2)
        elif grade[i] == "P":
            gradeList.append(3)
        elif grade[i] == "D":
            gradeList.append(4)
    
    result = 0
    preMonth = 0
    for i in range(month):
        if i == 0:
            if gradeList[i] == 4:
                result += payList[3]
            else:
                result += (payList[gradeList[i]]-1)
                preMonth = (payList[gradeList[i]]-1)
        else:
            if gradeList[i] == 4:
                result += payList[3]
            else:
                result += ((payList[gradeList[i]]-1)-preMonth)
                preMonth = ((payList[gradeList[i]]-1)-preMonth)
    
    print(result)

     

    Java

    import java.util.Scanner;
    
    public class Main {
        
        public static void main(String[] args) {
            
            Scanner scan = new Scanner(System.in);
            int month = Integer.parseInt(scan.nextLine());
            String[] firstLine = (scan.nextLine()).split(" ");
            int[] payList = {Integer.parseInt(firstLine[0]), Integer.parseInt(firstLine[1]),
                            Integer.parseInt(firstLine[2]), Integer.parseInt(firstLine[3])};
            
            int[] gradeList = new int[month];
            String[] grade = (scan.nextLine()).split("");
            for(int i = 0 ; i < month ; i++){
                if(grade[i].equals("B")){
                    gradeList[i] = 0;
                }else if(grade[i].equals("S")){
                    gradeList[i] = 1;
                }else if(grade[i].equals("G")){
                    gradeList[i] = 2;
                }else if(grade[i].equals("P")){
                    gradeList[i] = 3;
                }else if(grade[i].equals("D")){
                    gradeList[i] = 4;
                }
            }
    
            int result = 0;
            int preMonth = 0;
            for(int i = 0 ; i < month ; i++){
                if(i == 0){
                    if(gradeList[i] == 4){
                        result += payList[3];
                    }else{
                        result += (payList[gradeList[i]]-1);
                        preMonth = (payList[gradeList[i]]-1);
                    }
                }else{
                    if(gradeList[i] == 4){
                        result += payList[3];
                    }else{
                        result += ((payList[gradeList[i]]-1)-preMonth);
                        preMonth = ((payList[gradeList[i]]-1)-preMonth);
                    }
                }
            }
    
            System.out.println(result);
        
        }
    
    }

     

     

     

    후기


    생각보다 난이도가 쉬워 놀랐던 문제다. 실제로도 높은 난이도의 문제는 절대 아니지만(solved.ac 기준 실버 2) 어쩌면 지금 설정되어 있는 난이도도 조금은 하향 조정해도 되지 않을까... 싶은 생각이 들었다.

    댓글

Designed by Tistory.