Neoself의 기술 블로그

알고리즘 지식 정리(10월 31일)[백준 클래스 2] 본문

개발지식 정리/알고리즘

알고리즘 지식 정리(10월 31일)[백준 클래스 2]

Neoself 2024. 10. 31. 21:35

분해합

let input = readLine()!
let startNum = max(0,Int(input)!-9*input.count) // 생성자의 최소가능값
var ans = 0
for num in (startNum..<Int(input)!) {
    // String타입 Array로 변환 이후, map으로 한 문자씩 접근하여 누적합
    let sum = Array(String(num)).map{Int(String($0))!}.reduce(0,+)
    if num + sum == Int(input)! { // 누적합과 생성자 후보끼리 도하여서 분해합과 일치하면 반복 중단
        ans=num
        break
    }
}
print(ans)

 

 

후위 표기식2

import Foundation
let N = Int(readLine()!)!
let arr = Array("ABCDEFGHIJKLMNOPQRSTUVWXYZ").map { String($0) }[0..<N]
var nums:[Int]=[]
let expr = Array(readLine()!).map{String($0)}

for _ in 0..<N {
    nums.append(Int(readLine()!)!)
}

var operands:[Double] = []
var operand1:Double=0
var operand2:Double=0
var result:Double=0
for j in (0..<expr.count){
    // 표현식 중 연산자
    if ["*","+","/","-"].contains(expr[j]){
        operand2=operands.removeLast()
        operand1=operands.removeLast()
        switch expr[j]{
            case "*":
            result = operand1*operand2
            case "+":
            result = operand1+operand2
            case "-":
            result = operand1-operand2
            default:
            result = operand1/operand2
        }
        operands.append(result)
    } else {
        // 표현식 중 알파벳의 경우, 피연산자로 변환
        if let id = arr.firstIndex(where: {$0==expr[j]}){
           operands.append(Double(nums[id]))
        }
    }
}
print(String(format: "%.2f",result))