개요
32350번 문제는 특별한 알고리즘을 요구하는 문제가 아닌, 구현 문제이다. 문제링크
그러나 수많은 억까를 당하며 배운 내용을 정리해보겠다.

문제 풀이
문제 이름 답게 '오버킬'이 발생하면 정상범위 인덱스 내에서 다음 인덱스의 값을 차감해야 한다.
차감할 때는 '오버된 값의 p%'만큼 감소하는데
여기서 나는 Int(floor(Double(abs(currentValue)) * (Double(p) * 0.01)))로 작성했다.
그런데 이처럼 하면 87%에서 틀렸다고 뜬다.
왤까 ?
let NDp = readLine()!.split(separator: " ").map { Int($0)! }
let N = NDp[0], D = NDp[1], p = NDp[2]
var M = readLine()!.split(separator: " ").map { Int($0)! }
var pointer = 0
var result = 0
while pointer < N {
let standard = M[pointer]
let currentValue = standard - D
if currentValue < 0 { // 오버킬한 경우
M[pointer] = 0
if pointer + 1 < N {
let additionalValue = Int(floor(Double(abs(currentValue)) * (Double(p) * 0.01)))
M[pointer + 1] -= additionalValue
if M[pointer + 1] <= 0 {
M[pointer + 1] = 0
pointer += 1
}
}
pointer += 1
...
먼저 Int 타입이었던 p와 currentValue를 Double로 변환하고
변환한 값으로 연산 후 소수점을 버리고 다시 Int타입으로 변환하게 했다.
(여기서 floor는 빠져도 될듯)
이렇게 하면 Double로 변환된 과정에서 부동소수점에 의해 연산 결과가 내가 의도한 대로 나오지 않는 경우가 발생한다.
그래서 아래와 같이 Int -> Double -> Int가 아니라, Int 단위에서 연산을 수행하게끔 로직을 바꾸어야 했다.
let additionalValue = abs(currentValue) * p / 100
느낀점
코테나 백준처럼 문제풀이에서 실수 연산을 해야할 때에는 정수형 계산으로도 계산 가능하니까
Double로 형변환하여 연산할 필요가 없다는 것을 알았다.
'🖥️ Computer Science > Algorithm' 카테고리의 다른 글
[Algorithm] 비트마스킹 이론 & BOJ 11723 실습 (0) | 2024.12.30 |
---|---|
Swift로 알고리즘 풀 때 알아둬야할 것들 (1) | 2024.07.01 |
Swift로 코드 최적화하기 (0) | 2024.05.25 |
[백준] 7576, 토마토 (Swift) (0) | 2024.02.13 |
[백준] 2644, 촌수계산(C++, BFS) (1) | 2023.09.02 |