Algorithm/Algorithms Practice

[BOJ/C++] 게임을 만든 동준이(2847번)

Patrick_ 2022. 11. 1. 11:56

1. 개요

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

 

2847번: 게임을 만든 동준이

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

www.acmicpc.net

1-1. 설명

학교 수업을 들은 동준이는 스마트폰 게임을 제작하였다. 총 N개의 레벨이 있으며 각 레벨을 클리어시 점수가 주어진다. 이때, 점수는 레벨에 따라 높아져야 하나, 동준이의 실수로 쉬운 레벨이 어려운 레벨보다 점수를 많이 받는 경우를 만들었다. 이를 해결하기 위해 특정 레벨 점수를 감소시키려 한다. 각 레벨을 클리어할때 얻는 점수가 주어졌을때, 몇번 감소시키면 되는지 구하는 프로그램을 제작한다. 정답이 여러가지일 땐, 점수를 내리는 것을 최소한으로 하는 방법을 찾아야 한다. 

1-2. 제한 사항

 - 첫 줄에 레벨의 수 N이 주어지며, 1 이상 100 이하

 - 다음 줄부터는 각 레벨을 클리어하면 얻는 점수가 주어지며, 점수는 20,000보다 작은 양의 정수


2. 구현

2-1. 풀이

단순하게 마지막 레벨부터 첫 스테이지까지 반복문을 돌려 이전의 점수를 변수에 저장하고 그보다 한단계 낮은 수로 바꿔주었다. 

2-2. 코드

#include <iostream>
using namespace std;

int scores[100];

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int N, preNum, count, result = 0;
    cin >> N;
    for (int i = 0; i < N; i++) cin >> scores[i];

    preNum = scores[N - 1];
    for (int i = N - 1; i >= 0; i--) {
        if (i == N - 1) continue;
        else if (scores[i] >= preNum) {
            count = scores[i] - preNum + 1;
            result += count;
            scores[i] -= count;
        }
        preNum = scores[i];
    }
    cout << result;
    return 0;
}