문제
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
'CodingTest > Baekjoon' 카테고리의 다른 글
[baekjoon] 백준 15903번(파이썬): 카드 합체 놀이 (0) | 2021.07.03 |
---|---|
[baekjoon] 백준 16953번(파이썬): A → B (0) | 2021.07.02 |
[baekjoon] 백준 1417번(파이썬): 국회의원 선거 (0) | 2021.06.30 |
[baekjoon] 백준 12018번(파이썬): Yonsei TOTO (0) | 2021.06.29 |
[baekjoon] 백준 16120번(파이썬): PPAP (0) | 2021.06.25 |