초보 개발자의 이야기, 릿허브

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

코딩테스트/📗 백준 (BOJ)

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

릿99 2021. 8. 25. 12:23
728x90
반응형
1. 문제이해

2847번: 게임을 만든 동준이 (acmicpc.net)

 

2847번: 게임을 만든 동준이

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

www.acmicpc.net

 

동준이가 만든 게임에는 총 N개의 레벨이 있다.

 첫번째부터 마지막 레벨까지 각 레벨을 클리어할때 주는 점수가 주어질 때,

낮은 레벨보다 높은 레벨의 점수가 높아지도록 점수를 감소시키려고 한다.

주어진 조건에서 점수를 몇번 감소시키면 되는지를 출력하는 알고리즘을 구현하는 것이 목표이다.

 

 

 

2. 문제풀이

 

예전에 비슷한 문제를 풀었던 기억이 나는데.. 매수 문제였나..

낮은 레벨에서 높은 레벨까지, 점수가 오름차순을 이루도록 바꾸면 되는 문제이다.

예제 1에서, 주어진 수의 갯수(N)은 3개, 각 레벨의 점수는 5 5 5 이다.

레벨의 점수를 감소시키는 과정은 다음과 같다.

 

1. 5 5 5

2. 5 4 5

3. 4 4 5

4. 3 4 5

 

총 3번 감소시켜야 올바른 점수를 만들어낼 수 있다.

높은 레벨에서부터 확인해보면, 가장 높은 레벨과 그 전의 레벨의 점수를 비교했을때,

아래 레벨의 점수가 같거나 크므로, 해당 점수를 윗 단계의 점수보다 낮을때까지 감소시키면 된다.

두번째 레벨과 첫번째 레벨도 마찬가지이다. 4보다 5가 더 크므로, 2번 감소시켜주면 올바른 점수가 된다.

 

즉, 제일 높은 레벨부터 시작해, 바로 아래 레벨의 점수와 비교해,

아래 레벨의 점수가 윗레벨의 점수보다 작아질때까지 감소시키면 된다.

 

 

 

3. 소스코드
#include <iostream>
using namespace std;

int main() {
	int N;
	int level[100];
	int count = 0;

	cin >> N;

	for (int i = 0; i < N; i++) {
		cin >> level[i];
	}

	for (int i = N - 1; i > 0; i--) {
		// 이전 레벨의 점수가 더 높다면,
		while (level[i] <= level[i - 1]) {
			level[i - 1]--;	// 이전 레벨의 점수 감소
			count++;	// 감소시킨 횟수를 카운트
		}
	}
	
	cout << count;

	return 0;
}

레벨의 개수인 N과 각 레벨의 점수들(level[i])를 입력받는다.

레벨의 점수들을 위에서부터 확인해나가면서, 해당 레벨과 그 전의 레벨의 점수를 비교했을때,

이전 레벨의 점수가 더 크거나 같다면 점수를 해당 레벨의 점수보다 작아질때까지 감소시키고, 횟수를 카운트한다.

 

 

 


오늘도 무사히 한 문제를 끝냈다..

요즘 바쁘고 피곤하고 시험도 다가오고 그래서인지 마음이 계속 불편하다..😥

SQLD 공부도 열심히 해야되는데 맘같지 않네..😶

728x90
반응형