알고리즘/BOJ

[BOJ 2847, Python 3] 게임을 만든 동준이

70825 2021. 8. 1. 12:54
반응형

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

 

2847번: 게임을 만든 동준이

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

www.acmicpc.net

 

풀이

arr[i] < arr[i+1]만 만족하면 되는데, →방향으로 2중 for문을 돌리거나 ←방향으로 for문을 돌리는 풀이가 존재합니다.

 

1. →방향으로 2중 for문

arr[i] >= arr[i+1]일 때 arr[i]는 arr[i+1] - 1이 되는 것이 가장 최소로 점수를 내릴 수 있는 방법입니다.

2중 for문을 하는 이유는 [5, 5, 3]이 입력 값으로 들어올 때 단순 for문으로만 하면 arr배열의 값이  [4, 2, 3]으로 변경될 것이다. N = 100이므로 O(N^2)가 돌아가니 2중 for문을 하여 [5, 5, 3] -> [4, 2, 3] -> [1, 2, 3]로 바꾸어주면 됩니다.

 

 

2. ←방향으로 for문

arr[i] <= arr[i-1]일 때 1번 방법의 for문과 같습니다. 이건 왜 한 번만 해도 되냐면 1번 방법으로는 for문 1겹으로만 하면 arr[i] > arr[i-1]이 보장이 되지 못하는데, ←방향으로 for문을 한 번 돌리면 arr[i] > arr[i-1]이 보장되기 때문입니다.

 

 

 

코드

풀이1

1
2
3
4
5
6
7
8
9
= int(input())
arr = [int(input()) for i in range(n)]
ans = 0
for i in range(n):
    for j in range(n-1):
        if arr[j] >= arr[j+1]:
            ans += arr[j] - (arr[j+1- 1)
            arr[j] = arr[j+1- 1
print(ans)
cs

 

풀이2

1
2
3
4
5
6
7
8
= int(input())
arr = [int(input()) for i in range(n)]
ans = 0
for i in range(n - 10-1):
    if arr[i] <= arr[i-1]:
        ans += arr[i-1- (arr[i] - 1)
        arr[i-1= arr[i] - 1
print(ans)
cs
반응형