본문 바로가기

백준 write-up/정렬 & 그리디

[백준] 게임을 만든 동준이 : 2847번 - Python

728x90
반응형

https://www.acmicpc.net/problem/2847

 

2847번: 게임을 만든 동준이

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

www.acmicpc.net

 

 

 

문제를 풀면서 몰랐던 개념

 

[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)
728x90
반응형