알고리즘 문제 풀기

<스위프트&알고리즘> 못풀음, 동전2 2294번

studying develop 2020. 4. 16. 20:19

일단 2294번 한다.

//
//  main.swift
//  algorithm_practice
//
//  Created by 김동환 on 2020/04/16.
//  Copyright © 2020 김동환. All rights reserved.
//

import Foundation


let line = readLine()
let inputs = line?.split(separator : " ") ?? []
let n = Int(inputs.first ?? "") ?? 0
let k = Int(inputs.last ?? "" ) ?? 0
var coins: [Int] = []
var answer : [Int] = [0]

for _ in 0..<n {
    let line = readLine() ?? ""
    if let input = Int(line) {
        coins.append(input)
    }
}

for o in 1...k{
    var candidates : [Int] = []
    for coin in coins{
        if o >= coin, answer[o-coin] >= 0{
            candidates.append(answer[o-coin] + 1)
        }
    }
    answer.append(candidates.min() ?? -1)
}

print(answer.last ?? -1)



 

음 근데 이거 다른분 코드 참고한건데, 이분은 반복문이 ,나랑 다르네 순서가;; 반복문 순서가 중요한게 아닌가??

 

배열에 넣는 방식이 아니라 answer에 append해서 순차적으로 늘리는것도 음 좀 특이하군.

 

이걸 근데 함수형 프로그래밍으로 바꿔보자.

 

일단 iterate를 바꾸자.

 

음 근데 일단 이중루프를 어떻게 할지에서 막혔다. d2 강의에서 보여주긴 했는데 es6라 기억이 안난다. 못찾으면 그냥 그거 보고 바꾸는게 날거같다....

 

음 그냥 이중 루프 말고 방법이 없나. 

 

일단 이 에러가 검색 좀 해도 잘 모르겠다. 

 

func forEach<Seq : Sequence ,C> (a : Seq, b : Seq) -> Array<C>{
    for aa in a {
        for bb in b {
            
        }
    }
}

forEach<[Int],Int>(a: coins, b: [1...k])

ㅇㅇ이렇게 구현하려 하는데, 일단 에러가 나고, 음 맘에 안드는건, 이게 이중 반복문 기능을하는 함수이긴 한데, 그 안에 이중 포문을 사용한게 약간 찝찝하고, 음 이건 괜찬다 쳐도, 그 안에서 역할을할 함수를 못넣었다.

 

answer = forEach(a: coins, b: [1...k])

음 이렇게 하면 되나 보다. [http://minsone.github.io/mac/ios/swift-generics-summary] 이 글보다 보니, 스위프트는 자동으로 타입을 추론한다는거 보고, 내가 명시적으로 표시해준게 틀린걸수도 있다 생각했다.

 

 

음 근데 새로운 에러 나옴.

Cannot convert return expression of type '[Int]' to return type 'Array<C>'

func forEach<Seq : Sequence ,C> (a : Seq, b : Seq) -> Array<C>{
//이게 let이 array안에 원소 추가도 안되는 건가.?
    let arr : [Int] = []
    for aa in a {
        for bb in b {
            
        }
    }
    return arr
}

 

또 에러

Binary operator '>=' cannot be applied to two 'Seq.Element' operands

func forEach<Seq : Sequence ,C> (a : Seq, b : Seq) -> Array<C>{
//이게 let이 array안에 원소 추가도 안되는 건가.?
    let arr : [Int] = []
    for aa in a {
        for bb in b {
            if aa.self >= bb.self {
                
            }
        }
    }
    return arr
}

 

음 잘 모르겠다. 일단 보류하고 쉬운ㄱ ㅓ풀자.