https://www.acmicpc.net/problem/2847
문제를 풀면서 몰랐던 개념
[Python] for문에서 숫자를 감소시키면서 반복하기
-> 증가 폭을 음수로 설정하기!
arr = [ '20s', 'loves', 'one2ye' ]
for i in range(len(arr), 0, -1):
print(arr[i-1], end = ' ')
# 출력결과
>>> one2ye loves 20s
* arr의 길이의 수부터 0까지 -1씩 감소하면서 거꾸로 반복하는 것!!! - 인덱스 범위 때문에 arr[i-1] 부터 출력해줌.
문제의 접근 방법
- 얻을 수 있는 점수들이 오름차순 정렬되어야 함.
- 맨 뒤에 있는 점수가 가장 커야 하기 때문에 뒤에서부터 값을 비교해서 앞에 있는 수들을 뒤에 있는 수 보다 값을 작게 -1씩 해주어야 함.
- 1씩 작아질 때마다 count는(점수를 몇 번 감소시켰는지 계산해주는 변수) 1씩 증가하도록 구현해야 함.
내가 막혔던 부분
감소 for문을 사용해본 것이 처음이라서 인덱스 범위와 초기값을 설정하는 부분에서 'list index out of range' 에러가 나서 헤맸다. 또 중첩 반복문을 사용하는데에 있어서 어느 시점에 break를 걸어줘야 하고, 어떻게 변수를 설정해야 값을 하나하나 비교할 수 있는지 고민하는 시간이 오래 걸렸다.
문제 풀이 방법
(1) 레벨의 수 N 입력받기
(2) N번만큼 level을 입력받아서 빈 리스트 arr에 추가하기
(3) 점수를 몇 번 감소시키면 되는지에 대해 값을 넣어줄 count 변수 초기화하기
(4) 감소하는 반복문을 돌려서(두 값의 비교를 위해 중첩 반복문 사용) arr의 맨 뒤에 있는 값(i)이 그 앞의 값(j-1)보다 더 커질 때까지 j-1번째 값을 1씩 감소시키고, 감소시킬 때마다 count를 1씩 누적해서 더해주기
(5) 위 과정을 계속 반복하며 만약 i번째 값이 더 크다면 반복문 탈출하고, 현재 제일 큰 값인 arr[i] 요소 값을 제거하기
(6) 남아있는 값들을 가지고 (4)~(5) 과정 반복하기
(7) 누적돼서 계산된 count 값 출력해주기!
소스코드
N = int(input())
arr = []
for _ in range(N):
level = int(input())
arr.append(level)
count = 0
for i in range(len(arr)-1, 0, -1): # ex) arr의 길이는 3이지만 인덱스는 2까지 계산하기 때문에 -1을 해줌.
for j in range(len(arr)-1, 0, -1):
if arr[i] <= arr[j-1]: # j는 i번째 요소보다 앞에 있는 수를 나타내야 하기 때문에(크기 비교) -1을 해줌.
while True:
if arr[i] <= arr[j-1]: # arr[i] 값이 더 커질 때까지 반복!
arr[j-1] -= 1 # 1만큼 감소시키기
count += 1
else:
break # arr[i] > arr[j-1] 이면 반복문 탈출
del arr[i] # 한칸씩 앞으로 가서 비교하기 위해서 가장 큰 값은 삭제해주기!
print(count)
'백준 write-up > 정렬 & 그리디' 카테고리의 다른 글
[백준] 과제 : 13904번 - Python (0) | 2021.08.10 |
---|---|
[백준] 폴리오미노 : 1343번 - Python (0) | 2021.08.10 |
[백준] 세탁소 사장 동혁 : 2720번 - Python (0) | 2021.08.09 |
[백준] 뒤집기 : 1439번 - Python (0) | 2021.08.09 |
[백준] 동전 0 : 11047번 - Python (0) | 2021.08.09 |