[BOJ]백준#2847 Silver 4 게임을 만든 동준이 🎯 (Python, 파이썬)

임준성·2022년 5월 18일
0

백준 Algorithm

목록 보기
10/59
post-thumbnail

백준 2847번
https://www.acmicpc.net/problem/2847


문제



후기

⏰ 풀이시간 30분 ++⏰

가장 큰 수는 감소시킬 필요가 없으니, 가장 큰 수 다음으로 큰 수를 감소시키고,

또 그 다음으로 큰 수를 감소시키는 알고리즘을 적용하면 쉽게 풀리는 문제다.

단지 그것을 구현하는 과정에서 은근히 시간이 오래 걸렸다.

i번째 수보다 i+1 번째 수가 더 크다면, 서로 빼는 과정에서 음수가 나올 수 있으므로,

절대값 처리를 해주는 부분만 신경쓰면 되는 문제였다.

나의 풀이

import sys

input = sys.stdin.readline

n= int(input())


li= ([ int(input()) for _ in range(n)])  #점수를 리스트로 받는다. 


li.reverse() #가장 높은 점수가 맨앞으로 올 수 있게 한다. 

result =0  # i+1번째와 i번째가 점수가 증가하는 식으로 되려면 얼마를 증가시켜야 하는가 

ans = 0 #최종으로 몇번 감소했는가 

for i in range(n-1):  # 마지막에서 2번 째 수부터 감소시키면 되니 n번이 아닌 n-1번 

    if li[i+1] > li[i]:  # i+1번째 수가 i보다 크다면 

        result += abs(li[i+1] - li[i] +1)  # 음수가 나올 수 도 있기 때문에 절대값을 취한다. 

        li[i+1] = li[i+1] - result  # 감소시킨 값을 적용해야 한다. 

        ans += result  #최종 결과값에 더해준다. 

        result = 0 #다시 반복해야 되니 초기화 
    
    elif li[i+1] == li[i]:  #값이 같으면 

        result +=1 # 1번만 증가시키면 된다. 

        li[i+1] = li[i+1] - result
        
        ans += result

        result = 0        
    
    else:

        result = 0
    

print(ans)

profile
아무띵크 있이

0개의 댓글