공부하자!/알고리즘

백준 20546 기적의 매매법 Swift - 구현

지우개원정대 2023. 5. 23. 13:37

주식 매도/매수 방법이 다른 준현이와 성민이.

1/1~1/14 기간 동안 각자의 방법으로 자산을 불린 후 둘 중 누가 더 자산이 많은지 결과를 출력하는 문제.

  1. 1/1~1/14 배열을 돌면서 각자의 자산을 체크한다
  2. 준현이: 현재가가 현금보다 낮으면 전부 매수
  3. 성민이: 3일 연속 상승 & 보유 주식이 있다면 전량 매도 / 3일 연속 하락 & 현재가가 현금보다 낮으면 전량 매수
  4. 자산 계산: 현금 + 주가 * 주식 수
//
//  20546.swift
//  CodingTestPractice
//
//  Created by CHOI on 2023/05/21.
//
// 기적의 매매법

import Foundation

let cash = Int(readLine()!)!
let MachineDuck = readLine()!.split(separator: " ").map{ Int($0)! }

// 승자 판단 함수
func solution() -> String {
    var answer = "SAMESAME"
    let BNP = bnp(cash: cash, arr: MachineDuck)
    let TIMING = timing(cash: cash, arr: MachineDuck)
    
    if BNP > TIMING {
        answer = "BNP"
    } else if BNP < TIMING {
        answer = "TIMING"
    }
    
    return answer
}

// 준현이의 결과
func bnp(cash: Int, arr: [Int]) -> Int {
    var tempCash = cash
    var stock = 0
    var asset = 0
    
    // 주가가 현금보다 낮다면 살 수 있는 만큼 매수
    arr.forEach { price in
        if price <= tempCash {
            stock += tempCash / price
            tempCash = tempCash % price
        }
    }
    asset = tempCash + stock * arr[13]
    
    return asset
}

// 성민이의 결과
func timing(cash: Int, arr: [Int]) -> Int {
    var tempCash = cash
    var stock = 0
    var asset = 0
    var keepGoing = 0 // 연속 며칠동안 상승/하락인지 판단하는 변수
    
    for i in 0...13 {
        let price = arr[i]
        
        // 전날보다 상승/하락인지 판단 후 keepGoing에 반영
        if i > 0 && arr[i - 1] < arr[i] {
            if keepGoing < 0 {
                keepGoing = 1
            } else {
                keepGoing += 1
            }
        } else if i > 0 && arr[i - 1] > arr[i] {
            if keepGoing > 0 {
                keepGoing = -1
            } else {
                keepGoing -= 1
            }
        } else if i > 0 && arr[i - 1] == arr[i] {
            keepGoing = 0
        }
        
        // 3일 연속일 경우 전량 매도/매수
        if keepGoing >= 3 && stock > 0 {
            // sell
            tempCash += stock * price
            stock = 0
        } else if keepGoing <= -3 && price < tempCash {
            // buy
            stock += tempCash / price
            tempCash = tempCash % price
        }
    }
    
    asset = tempCash + stock * arr[13]
    
    return asset
}

print(solution())

실버 5의 쉬운 문제였다. 이런 문제들은 시간을 줄이는 게 관건인 듯 하다.. 더 많이 풀어보자