본문 바로가기
Algorithm

[백준] 2847 게임을 만든 동준이 / 파이썬

by suhyeon chae 2023. 7. 25.
https://www.acmicpc.net/problem/2847

 

 

 

아이디어

예제 2를 예로 들면
5 3 7 5 레벨당 증가하는 점수가 각각 5, 3, 7, 5 이다. 1레벨을 통과하면 5점이 오르고 2레벨을 통과하면 3점이 오른다는 뜻이다. 하지만 1레벨이 2레벨보다 점수 증가폭이 크면 안된다!!   이전 레벨이 다음 레벨보다 점수 증가폭이 큰 경우 점수를 내려야한다. 문제 조건 중에 점수를 내리는 것을 최소한으로 해야한다고 적혀있다.  

점수 내리는 것을 최소화 한다는 것은 이전 레벨이 다음 레벨보다 증가할 점수가 1만 차이나도록 점수를 내리는 것이 최소한으로 줄이는 것이다. 

예를 들어 5 3 7 5면 4레벨이 5점인데 3레벨이 7점을 오른다고 했으므로 3레벨을 4로 만들어주면 된다. 3레벨이 4인데 2레벨은 3이니까 내릴 필요 없고(이전 레벨의 점수 증가폭이 더 작으므로 괜찮음) 2레벨은 3인데 1레벨이 5점오른다고 했으므로 1레벨 점수 증가 폭을 2로 만들어 주면 된다. 따라서 7을 4로 만들어 주려면 3점을 내려야하고, 5를 2점으로 만들어 주려면 3점을 내려야 하므로 3 + 3 = 6점이 된다.  
 
또 다른 예를 들어보자 5 5 5 라는 점수가 있으면 3레벨이 5점인데 2레벨도 5점이므로 안된다. 2레벨을 3레벨과 1점만 차이나게 내리면 2레벨은 4점이 된다. 2레벨이 4점인데 1레벨은 5점이다. 2레벨과 1점만 차이나게 내리면 3점이다. 

그러면 처음에 5 5 5 였던 것이 3 4 5가 된다. 5를 4로 만들려면 1점을 내려야하고, 5를 3점으로 만들려면 2점을 내려야 하므로 1 + 2 = 3점을 내리는 것이 최소한으로 내린 것이다. 

 

 

코드 풀이
n = int(input())
score = [int(input()) for _ in range(n)]
result = 0

# 앞 레벨의 증가 점수가 큰 경우 뒷 레벨 점수와 1 차이나게 하는게 최소한으로 하는 방법

for i in range(n-2, -1, -1): # 점수를 거꾸로 돈다. [처음 ~ 마지막 -1] ex) [5, 3, 7, 5]이면 [5, 3, 7] 만 반복문으로 돈다.
    if score[i] >= score[i+1]: # 앞에 점수가 뒤에 점수보다 크다면 앞 점수를 뒷 점수 -1 만큼 만들어 줘야 한다.
        result += (score[i] - score[i+1] + 1) # 앞점수 - 뒷점수만 하면 앞점수가 뒷 점수랑 똑같은 숫자가 되므로 1점 더 감소 시켜줘야 한다.
        score[i] = score[i+1]-1 # 현재 점수를 뒷점수 -1 숫자를 대입한다.

print(result)