BOJ/Swift

백준 17939번 Gazzzua 파이썬

띵지니어 2024. 6. 3. 10:41
반응형

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

 

내 코드

N = int(input())
coin = list(map(int, input().split()))[::-1]

standard = coin[0]
result = 0

for i in range(1, len(coin)):
    if standard > coin[i]:
        result += standard - coin[i]
    else:
        standard = coin[i]
        
print(result)

 

Review

문제에 나와있는 핵심 조건은 아래와 같습니다.

1. 구매는 매 분마다 1개씩 가능
2. 판매는 제한 없음

문제에 나와 있는 예제 1 5 10 2 4 3으로 설명하겠습니다.

언제 사고 언제 파는지에 대한 기준을 정해야 한다고 생각을 했습니다.

하지만 그냥 보면 아무것도 생각 안 나서.. 뒤집어 보겠습니다

3 4 2 10 5 1

이렇게 봤을 때, 생각나는 논리가 있었습니다.

현재 index 기준으로 오른쪽에 있는 것 중에 자기 보다 가격이 낮은 것까지 체크를 하여 수익을 계산하면 된다.
자기보다 크다면 기준을 변경하여 위 내용을 반복합니다.

그림으로 보면 아래와 같습니다.

 

이렇게 구현을 하면 시작 복잡도는 O(N)이 나오게 됩니다.
처음에는 while 문으로 풀었는데 가독성 면으로도 for문이 훨씬 괜찮은 것 같습니다.

아래는 Swift 언어 + while 문입니다.

import Foundation

let N = Int(readLine()!)!

let arr =  readLine()!.split(separator: " ")
    .compactMap { Int($0) }.reversed()
    .map { Int(String($0))! }

var index = 0
var result = 0

var standard = arr[0]

while N - index > 1 {
    
    if standard > arr[index + 1] {
        result += (standard - arr[index + 1])
    } else {
        standard = arr[index + 1]
    }
    index += 1
}

print(result)
반응형