CodingTest/Baekjoon

[baekjoon] 백준 2847번(파이썬): 게임을 만든 동준이

JunJangE 2021. 7. 1. 11:58

문제

 

2847번: 게임을 만든 동준이

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

www.acmicpc.net

- 학교에서 그래픽스 수업을 들은 동준이는 수업시간에 들은 내용을 바탕으로 스마트폰 게임을 만들었다.

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

- 플레이어의 점수는 레벨을 클리어하면서 얻은 점수의 합으로, 이 점수를 바탕으로 온라인 순위를 매긴다.

- 동준이는 레벨을 난이도 순으로 배치했다.

- 하지만, 실수로 쉬운 레벨이 어려운 레벨보다 점수를 많이 받는 경우를 만들었다.

- 이 문제를 해결하기 위해 동준이는 특정 레벨의 점수를 감소시키려고 한다.

- 이렇게 해서 각 레벨을 클리어할 때 주는 점수가 증가하게 만들려고 한다.

- 각 레벨을 클리어할 때 얻는 점수가 주어졌을 때, 몇 번 감소시키면 되는지 구하는 문제이다.

- 점수는 항상 양수이어야 하고, 1만큼 감소시키는 것이 1번이다.

- 항상 답이 존재하는 경우만 주어진다.

- 정답이 여러 가지인 경우에는 점수를 내리는 것을 최소한으로 하는 방법을 찾아야 한다.

알고리즘

- 레벨의 수를 입력받는다.

- 각 레벨의 점수를 입력받는다.

- 더 큰 레벨부터 계산하기 위해 각 레벨의 점수를 거꾸로 바꾼다.

- 더 높은 레벨의 점수를 타겟으로 한다.

- 반복문을 이용하여 더 높은 레벨이 그 전 레벨보다 점수를 더 많이 안 주면 더 높은 레벨의 점수보다 -1 작게 그 전 레벨의 점수를 받게 한다.

- 이때 뺀 점수를 리스트에 넣고 마지막에 리스트에 합을 출력하면 된다.

코드

import sys

n = int(sys.stdin.readline())
point = [int(sys.stdin.readline()) for _ in range(n)]
# 마지막 레벨에서 첫 번째 레벨로 리스트를 거꾸로 바꾼다.
point.reverse()
# 더 높은 레벨의 점수를 타겟으로 정한다.
target = point[0]
res = []
# 마지막 레벨을 제외한 레벨 수만큼 반복한다.
for i in range(1, n):
    # 더 높은 레벨이 그 전 레벨 보다 점수를 더 많이 안주면
    # 더 높은 레벨의 점수보다 -1 작게 그 전 레벨의 점수를 받게 한다.
    if target <= point[i]:
        cnt = - (target - point[i] - 1)
        point[i] -= cnt
        res.append(cnt)
        
    # 타겟을 다음 레벨 점수로 바꾼다.
    target = point[i]
    
# 리스트에 합을 출력한다.
print(sum(res))

github

 

junjange/CodingTest

내가 푼 코딩 테스트 문제와 해결법. Contribute to junjange/CodingTest development by creating an account on GitHub.

github.com