컴굥일지

[BOJ/백준 2847][C++] 게임을 만든 동준이 본문

알고리즘/코테 문제

[BOJ/백준 2847][C++] 게임을 만든 동준이

gyong 2022. 1. 5. 21:43
반응형

문제

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

 

문제 내용

각 레벨에서 얻을 수 있는 점수를 오름차순으로 만들어야 한다.
즉, 최고점을 기준으로 각 단계를 몇 번 감소시켜야 할지를 계산하면 된다.
항상 답이 존재하는 경우만 입력으로 주어진다고 되어있으므로, 점수를 감소시키다가 음수가 되는 일은 발생하지 않는다.

 

문제 풀이

그렇게 어려운 문제는 아니다.
배열을 뒤에서부터 반복문을 돌면서 i번째 값과 i-1의 값을 비교하면 된다.
조건문을 통해 i번째 값이 큰 경우는 별다른 처리 없이 넘어가면 된다.
i번째 값이 작은 경우 i-1번째 값과 i번째 값이 적어도 1은 차이가 나야 하기 때문에 (두 값의 차이 -1)를 구하여 계산하면 된다.

 

코드

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n, a, num, cnt;

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	
    //입력
	cin >> n;
	vector<int>v;
	for (int i = 0; i < n; i++) {
		cin >> a;
		v.push_back(a);
	}
	
    //문제 해결
	cnt = 0;
	for (int i = n - 1; i > 0; i--) {
		if (v[i] > v[i - 1]) continue;  //배열이 오름차순이라면 건들지 않는다

		num=v[i - 1] - v[i] + 1;  //두 레벨의 점수 차를 구하여
		v[i - 1] -= num;  //낮은 레벨은 점수를 감소시킨다
		cnt += num;	 //얼만큼 감소시켰는지 추가한다
	}
	
    //결과 출력
	cout << cnt << '\n';
}

 

문제 코드 설명

1) 입력

레벨의 개수 N을 입력받아 배열을 생성할 것이기 때문에 vector를 사용했다.

 

2) 문제 해결

반복문과 조건문을 사용하면 된다.
이때, 반복문 사용시 인덱스를 조심해야 한다.

반응형
Comments