알고리즘

[Swift 알고리즘] 백준 11501 주식

코코종 2023. 4. 6. 11:41
728x90

안녕하세요 코코종입니다.

2일차에 푼 문제 '주식'입니다. 처음에는 알고리즘을 잘못짜서 실패했었는데 그 내용도 보여드릴게요

//
//  main.swift
//  BackJoon
//
//  Created by kokojong on 2023/04/03.
//

import Foundation
// 11501 주식 그리디 실2

// 주식 하나를 산다.
// 원하는 만큼 가지고 있는 주식을 판다.
// 아무것도 안한다.
// 3가지 중 하나를 한다.

// idea: 올라가거나 같을 때만 산다. 내려갈때는 암것도 안한다.


let t = Int(readLine()!)!

for _ in 0..<t {
    let n = Int(readLine()!)!
    let arr = readLine()!.components(separatedBy: " ").map { Int($0)! }
    
    var gain = 0 // 이득
    var cost = 0 // 지불한 가격
    var cnt = 0 // 주식 보유 수
    
    var flow: [Bool] = []
    
    for i in 0..<n - 1 {
        flow.append(arr[i] <= arr[i+1])
    }
//    print(flow)
    
    for i in 0..<n-1 {
        if flow[i] { // 앞으로 오르면 -> 주식 구매
            cnt += 1
            cost += arr[i]
        } else { // 앞으로 떨어지면 -> 주식 판매
            gain += cnt * arr[i] - cost
            cnt = 0
            cost = 0
        }
    }
    
    gain += cnt * arr[n-1] - cost
    
    print(gain)
    
}

처음에 틀련던 방법인데요. 올라가는지 내려가는지에 대한 배열을 만들고, 올라갈것이라면 사고 내려갈것이라면 팔고 하는 식으로 처리했습니다. 그러나 간과했던 것이 예를들어 1 1 3 2 100 이라고 하면 100일때 다 파는게 좋지만 제가 작성한 코드에서는 3에서 2가 될 때 팔아버리더라구요... 그래서 컨닝 + 생각을 좀 해서 아래와 같이 수정했습니다.

 

//
//  main.swift
//  BackJoon
//
//  Created by kokojong on 2023/04/04.
//
import Foundation
// 11501 주식 그리디 실2
// idea (컨닝): 뒤에서부터 탐색을 해서 최대값을 갱신해주면서 구매 판매 판단

let t = Int(readLine()!)!
for _ in 0..<t {
    let n = Int(readLine()!)!
    let arr = Array(readLine()!.split(separator: " ").map { Int(String($0))! }.reversed())
    
    var gain = 0
    var maxPrice = arr.first!
    
    for value in arr {
        if value >= maxPrice {
            maxPrice = value
        } else {
            gain += (maxPrice - value)
        }
    }
    
    print(gain)
    
}

핵심 아이디어는 뒤에서부터 오면서 제일 큰 값을 계속 갱신하며 큰 값을 기준으로 주식을 판다고 생각한 것 입니다.

❗️ 참고로 원래 components 로 했더니 계속 시간 초과가 나서 너무 킹받았던 기억이 있습니다...아무리 봐도 맞게 했는데!!!!! 맞왜틀?! 이러면서 하다가 시간을 많이 잡아먹었어요...

관련한 내용은 알아보고 제가 따로 깃헙에 정리 해봤땁니다 https://github.com/kokojong/kokojong_TIL/issues/16

728x90