공부하기/백준

[Java] 백준 풀기 2847 - 게임을 만든 동준이

XEV 2023. 4. 22. 23:22

자바 백준 2847번

실버 4

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

 

2847번: 게임을 만든 동준이

학교에서 그래픽스 수업을 들은 동준이는 수업시간에 들은 내용을 바탕으로 스마트폰 게임을 만들었다. 게임에는 총 N개의 레벨이 있고, 각 레벨을 클리어할 때 마다 점수가 주어진다. 플레이어

www.acmicpc.net

 

 

 

 

 

문제 보기

분류: 그리디 알고리즘

 

 

 

 

 

문제 풀기

게임의 레벨이 높으면 그 아래 레벨보다 점수가 높아야 하기 때문에 가장 높은 레벨부터 점수를 확인하는 식으로 하여 레벨을 내려가며 검사한다.

 

총 레벨의 개수만큼 array 를 생성하여 그 안에 레벨이 낮은 순서로 숫자를 입력한다.

점수가 모두 입력된 array 에서 for loop 를 통해 제일 마지막 index 부터 바라보고, 레벨이 높은 index 와 그 아래 레벨인 index - 1 을 비교하여 높은 레벨의 점수가 낮은 레벨의 점수보다 낮거나 같을때의 조건문을 형성한다.

이 조건문에 진입하게 되면 초기화한 count 를 levelArr[j - 1] - levelArr[j] + 1 만큼 누적하여 늘려준다. 이 코드는 후에 적게될 index 에 영향을 받기 때문에 먼저 실행한다. 그리고 낮은 레벨의 점수인 levelArr[j - 1] 의 value 를 높은 레벨의 점수인 levelArr[j] - 1 의 value 로 변경한다.

조건문에 진입하지 않는 경우에는 다음 아래 레벨과 그 아래아래 레벨이 점수 변경없이 비교를 시작하게 된다.

 

 

 

 

 

코드 보기

import java.util.Scanner;

public class Main {
    public static void main(String args[]) {
        
        Scanner sc = new Scanner(System.in);
        
        int totalLevel = sc.nextInt();  // 전체 레벨 입력.
        
        int[] levelArr = new int[totalLevel];  // 레벨 개수 만큼 array 생성.
        
        for (int i = 0; i < totalLevel; i++) {  // 생성된 array 낮은 레벨 순서로 점수 입력.
            levelArr[i] = sc.nextInt();
        }
        
        int count = 0;  // 문제가 있는 점수에 대해 낮춰야 하는 횟수를 count 로 초기화.
        for (int j = totalLevel - 1; j > 0; j--) {  // array 의 가장 높은 레벨인 맨 뒷 index 부터 검사.
            if (levelArr[j - 1] >= levelArr[j]) {  // 높은 레벨이 바로 그 아래 레벨보다 작거나 같으면.
                count += levelArr[j - 1] - levelArr[j] + 1;  // 점수차 + 1 만큼 카운트 증가. (바로 아래 array 의 value 를 바꿀것이기에 먼저 코드 적용.)
                levelArr[j - 1] = levelArr[j] - 1;  // 낮은 레벨의 점수를 높은 레벨의 점수 - 1 로 변경.
            }
        }
        
        System.out.print(count);

    }
}