본문 바로가기
코딩테스트

백준 1039 - 교환 - swift

by vapor3965 2021. 6. 26.

목차

    https://www.acmicpc.net/problem/1039

     

    1039번: 교환

    첫째 줄에 정수 N과 K가 주어진다. N은 1,000,000보다 작거나 같은 자연수이고, K는 10보다 작거나 같은 자연수이다.

    www.acmicpc.net

     

    완전탐색이 필요한 문제다. 

     

    완전탐색을 하면 중복되는 경우의수가 존재할수있는데, 

    이는 check [ 숫자 ] [ k ]  = k번 교환했을때 숫자가 이미 나왔는지 

    로 체크하여 중복횟수를 줄일 수 있다. 

     

    길이가 1인경우와  길이가 2면서 0이포함된 숫자는 교환할수없다는 부분도 고려해야한다. 

     

    let inp = readLine()!.split(separator: " ").map{Int(String($0))!}
    var check = Array(repeating: Array(repeating:false, count:11), count: 1000001)
    let len = String(inp[0]).count
    var mx = 0
    var queue = [(String(inp[0]).map{String($0)}, 0)]
    var q = 0
    
    while queue.count > q {
        let f = queue[q]
        q += 1
        if f.1 == inp[1] {
            mx = max(mx, Int(f.0.joined())!)
            continue
        }
        for i in 0..<len {
            for j in i+1..<len {
                var tempt = f.0
                tempt.swapAt(i,j)
                if tempt[0] == "0" { continue }
                let x = Int(tempt.joined())!
                if check[x][f.1+1] { continue }
                check[x][f.1+1] = true
                queue.append((tempt, f.1+1))
            }
        }
    }
    print(mx == 0 ? -1 : mx)

    댓글