[Algorithm] 백준 32350 - Swift 풀이

2024. 12. 28. 02:13·🖥️ Computer Science/Algorithm

개요

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로 코드 최적화하기  (1) 2024.05.25
[백준] 7576, 토마토 (Swift)  (0) 2024.02.13
[백준] 2644, 촌수계산(C++, BFS)  (1) 2023.09.02
'🖥️ Computer Science/Algorithm' 카테고리의 다른 글
  • [Algorithm] 비트마스킹 이론 & BOJ 11723 실습
  • Swift로 알고리즘 풀 때 알아둬야할 것들
  • Swift로 코드 최적화하기
  • [백준] 7576, 토마토 (Swift)
kyxxn
kyxxn
컴퓨터공학을 좋아하는 대학생의 공부 일기
  • kyxxn
    컴공 학부생의 공부 일기
    kyxxn
  • 전체
    오늘
    어제
    • 분류 전체보기 (156)
      • 📱 iOS (64)
        • Xcode (10)
        • Swift (17)
        • Swift Concurrency (12)
        • UIKit (21)
        • SwiftUI (0)
      • 🖥️ Computer Science (57)
        • 🏛️ Software Architecture Pa.. (2)
        • 👨🏻‍🎨 Design Pattern (3)
        • Data Structure (4)
        • Algorithm (10)
        • Computer Architecture (4)
        • Operating System (19)
        • Network (15)
      • ✍🏻 회고록 (9)
      • 🎸 기타 (25)
        • 해커톤 (1)
        • git (6)
        • 세미나 (1)
        • 책을 읽고 (1)
        • AOS, Kotlin (6)
        • Reinforcement Learning (9)
  • 블로그 메뉴

    • 링크

      • 깃허브
      • 일상 블로그
    • 공지사항

    • 인기 글

    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.0
    kyxxn
    [Algorithm] 백준 32350 - Swift 풀이
    상단으로

    티스토리툴바