본문 바로가기

알고리즘

[그리디] 백준 2847번 게임을 만든 동준이 Python 풀이

728x90
반응형

문제 요약

게임은 총 N개의 레벨이 있고, 각 레벨을 클리어할 때마다 점수가 주어진다.

쉬운 레벨부터 어려운 레벨 순서로 점수가 주어지는데, 어려워질수록 점수는 증가해야 한다.

쉬운 레벨이 어려운 레벨보다 점수가 높을 경우, 해당 레벨의 점수를 감소시킨다.

총 몇 번을 감소시켜 점수가 증가하도록 만들 수 있는지 구하는 프로그램을 작성하라.

※ 점수는 항상 양수여야 하고, 1을 감소시키는 것이 1번으로 친다. 항상 답이 존재하는 경우만 주어지고, 정답이 여러 가지인 경우 최솟값을 구하라.

백준 2847번 문제 바로가기

입력

첫째 줄에 레벨의 수 N (1 <= N <= 100)

다음 N개의 줄은 첫 번째 레벨부터 마지막 레벨까지의 점수가 순서대로 주어짐

점수는 20,000보다 작은 양의 정수

출력

첫째 줄에 점수를 몇 번 감소시키면 되는지 출력

입출력 예시

입력 출력
4
5
3
7
5
6

작성 코드

약 40분 소요

N = int(input())
array = []
count = 0
for i in range(N):
    array.append(int(input()))

for i in range(N - 1, 0, -1):
    if i == 0:
        break
    if array[i] == array[i - 1]:
        count += 1
        array[i - 1] -= 1
    elif array[i] < array[i -1]:
        count += array[i - 1] - array[i] + 1
        array[i - 1] -= array[i - 1] - array[i] + 1
print(count)

피드백

문제를 푸는 큰 패턴은 알아차렸지만, 상세한 부분을 놓치는 바람에 여러번 틀렸다.

그리고 입력 값이 한 줄씩 되어 있어서, N 값과 점수를 헷갈려서 패턴을 찾는데 더 오래 걸렸다.

내가 찾은 패턴

  • 점수는 최소 1 이상 차이 나야 한다.
  • 큰 점수 - 작은 점수 + 1을 하면 count 값을 구할 수 있다.
  • 가장 큰 수부터 비교하며 값을 변경해야 한다.

다른 사람 풀이 참고

n=int(input())
nums=[]
ans=0
for i in range(n):
    nums.append(int(input()))
for i in range(n-1,0,-1):
    if nums[i]<=nums[i-1]:
        ans+=nums[i-1]-(nums[i]-1)
        nums[i-1]=nums[i]-1
print(ans)
  • nums[i]와 nums[i-1]이 같은지 아닌지 구분할 필요 X

깨달은 것

  • 패턴이 헷갈리고 해결이 되지 않을 때, 기존 코드를 지우고 다시 짜보자.
    문제를 찾아 고치는 것보다 새로 시작하는게 훨씬 빠른 길일 때가 많다.
728x90
반응형