https://www.acmicpc.net/problem/20546
20546번: 🐜 기적의 매매법 🐜
1월 14일 기준 준현이의 자산이 더 크다면 "BNP"를, 성민이의 자산이 더 크다면 "TIMING"을 출력한다. 둘의 자산이 같다면 "SAMESAME"을 출력한다. 모든 결과 따옴표를 제외하고 출력한다.
www.acmicpc.net
문제접근
이번문제가 복잡해 보여도 천천히 읽어만 봐도 풀 수 있다는 생각이 들어 정해진 시간이 지나도 계속 문제를 풀어봤다. 다른 일을 하다가도 계속 머릿속으로 어떻게 풀면 될까 계속된 고민을 했다.
let firstMoney = Int(readLine()!)!
let stock = readLine()!.split(separator: " ").map{Int($0)!}
var stockCount = 0
var div: [Int] = []
var remain: [Int] = []
var sum = 0
for i in 0..<stock.count {
if i == 0 {
div.append(firstMoney/stock[i])
remain.append(firstMoney%stock[i])
stockCount = div[i] * stock[i] + (stock[13]-stock[i])
sum += (stockCount + firstMoney)
}
for j in 0..<remain.count {
if remain[j] >= stock[i] {
div.append(remain[i]/stock[i])
remain.append(remain[i]%stock[i])
}
else {
var firstMoney = remain
}
}
stockCount = div[i] * stock[i] + (stock[13]-stock[i])
sum += (stockCount + firstMoney)
print(sum)
}
위 코드를 내가 풀다 막혀버린 코드이다 참고 하진 마시길.. 성민이는 고민하다 풀지 못했고 준현이는 풀 수 있을 거 같아서 준현이 먼저 풀어봤다. 몫과 나머지 배열을 만들어주고 주어진 현금에 주가를 나누어 몫은 매수 가능 주식수가 되고 남은 현금은 나머지가 되는 것이다.

위코드는 나름 고민해서 풀어봤는데 정답 예시로 주어진 자산이 나오지 않았다... 그리고 😂

인덱스 범위가 넘어서는 오류도 생겼다. 이건 해결을 했는데 다시는 이런 오류를 보지 않기 위해서 따로 정리를 해두었다.
https://h2kangrok.tistory.com/7
[Swift] Array.count에서 오류가 난 이유?
최근 코테를 공부하다가 인덱스 범위를 벗어났다는데 이게 무슨 말이지?? 한번 해결해 보자!! 코드를 보면 remain 배열의 개수까지 반복을 돌려보려고 했는데 오류가 생겼다. 우선 count는 배열의
h2kangrok.tistory.com
코드는 블로그를 참고해 보았다!
정답풀이
let money = Int(readLine()!)!
let chart = readLine()!.split(separator: " ").map { Int($0)! }
var J: (money: Int, stock: Int) = (money, 0)
var S: (money: Int, stock: Int) = (money, 0)
var downCount = 0
var upCount = 0
for i in 0..<chart.count {
if i != 0 {
if chart[i] > chart[i-1] {
upCount += 1
downCount = 0
} else if chart[i] == chart[i-1] {
upCount = 0
downCount = 0
} else {
downCount += 1
upCount = 0
}
}
if J.money >= chart[i] {
J.stock += J.money / chart[i]
J.money -= J.money / chart[i] * chart[i]
}
if downCount >= 3 && S.money >= chart[i] {
S.stock += S.money / chart[i]
S.money -= S.money / chart[i] * chart[i]
}
if upCount >= 3 && S.stock > 0 {
S.money += S.stock * chart[i]
S.stock = 0
}
if i == 13 {
if J.money + J.stock * chart[i] > S.money + S.stock * chart[i] {
print("BNP")
} else if J.money + J.stock * chart[i] < S.money + S.stock * chart[i] {
print("TIMING")
} else {
print("SAMESAME")
}
}
}
이 코드를 보면서 난 좀 감동했다 ㅋㅋ 어떤 사람이 보느냐에 따라 코드가 부족해 보일 수도 더 나은 코드가 있을 수 있지만 지금 내가 보는 시점에서는 코드가 너무 깔끔하고 이해가 쉬운 코드였다. 다른 문제를 풀 때도 영향을 많이 받을 거 같다.
코드를 보면 내가 전혀 생각하지도 못한 튜플을 이용해서 풀었다. 튜플의 문법에 대해서는 이제 사용할 일이 많아질 거 같아서 나중에 따로 정리를 해보겠다. 우선 코드를 보면 for문을 이용해서 성민이의 주식투자법인 3일 이상 상승이면 '매도' 3일 이상 하락이면 '매수'하는 조건이기 때문에 3까지 카운트를 하는 코드를 작성해 준다.
for문안에는 준현이가 주식을 매수하는 조건과 성준이가 매수하는 조건을 만들어주었다. 준현이의 매수 조건을 맞추기 위해 몫과 나머지로 구할 생각 했는데 그냥 몫에 주가를 곱해서 주어진 돈에 빼줘도 됐었다. 조금 더 쉽데 접근했으면 생각했을 방법인데 접근을 좀 복잡하게 했던 거 같다.
'Algorithm' 카테고리의 다른 글
| [Algorithm] Swift 백준 1157번 (3) | 2024.01.09 |
|---|---|
| [Algorithm] Swift 백준 14467번 (3) | 2023.11.18 |
| [Algorithm] Swift 백준 1292번 (1) | 2023.11.09 |
| [Algorithm] Swift 백준 3040번 (1) | 2023.11.07 |
| [Algorithm] Swift 백준 1316번 (3) | 2023.11.04 |