728x90
반응형
문제 요약
게임은 총 N개의 레벨이 있고, 각 레벨을 클리어할 때마다 점수가 주어진다.
쉬운 레벨부터 어려운 레벨 순서로 점수가 주어지는데, 어려워질수록 점수는 증가해야 한다.
쉬운 레벨이 어려운 레벨보다 점수가 높을 경우, 해당 레벨의 점수를 감소시킨다.
총 몇 번을 감소시켜 점수가 증가하도록 만들 수 있는지 구하는 프로그램을 작성하라.
※ 점수는 항상 양수여야 하고, 1을 감소시키는 것이 1번으로 친다. 항상 답이 존재하는 경우만 주어지고, 정답이 여러 가지인 경우 최솟값을 구하라.
입력
첫째 줄에 레벨의 수 N (1 <= N <= 100)
다음 N개의 줄은 첫 번째 레벨부터 마지막 레벨까지의 점수가 순서대로 주어짐
점수는 20,000보다 작은 양의 정수
출력
첫째 줄에 점수를 몇 번 감소시키면 되는지 출력
입출력 예시
입력 | 출력 |
4 5 3 7 5 |
6 |
작성 코드
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
반응형
'알고리즘' 카테고리의 다른 글
[그리디] 백준 1439번 뒤집기 Python 풀이 (0) | 2021.02.24 |
---|---|
[구현] 백준 1009번 분산처리 Python 풀이 (0) | 2021.02.20 |
[정렬] 백준 1026번 보물 Python 풀이 (0) | 2021.02.20 |
[그리디] 백준 1541번 잃어버린 괄호 (0) | 2021.02.19 |
[그리디] 백준 2457번 공주님의 정원 Python 풀이 (0) | 2021.02.16 |