youngjaeLee1026 2022. 3. 31. 12:07

1. 문제

스크린샷 2022-03-31 12 00 06

2. 입출력

스크린샷 2022-03-31 12 00 24

3. 입출력 예시

스크린샷 2022-03-31 12 00 45

4. 문제 설계

  1. 순열 구하는 문제와 동일하게 Back-tracking 알고리즘을 통해 문제를 해결할 수 있음
  2. 여기서 주의할 점은 주어진 k개 만큼의 1을 다 소모해야 하고, 각 이진수에 1이 k개 만큼만 포함되어 있어야 하므로
  3. k가 0이될 때만 출력을 해주어야함

5. 전체 코드

//MARK: - tobin

//MARK: - Framework
import Foundation

//MARK: - Variable
var n: Int = 0
var k: Int = 0

//MARK: - Function
func getBinary(_ current: Int, _ result: inout [Int]) -> Void {
    if current >= n {
        if k == 0 {
            var answer: String = ""
            for i in 0..<n {
                answer += "\(result[i])"
            }
            
            print(answer)
        }
    } else {
        if k == 0 {
            var answer: String = ""
            for i in 0..<n {
                answer += "\(result[i])"
            }
            
            print(answer)
        } else {
            for i in stride(from: 1, through: 0, by: -1) {
                result[current] = i
                k += i == 1 ? -1 : 0
                getBinary(current + 1, &result)
                k += i == 1 ? 1 : 0
            }
        }
    }
}

func solution() -> Void {
    //MARK: - Input
    guard let input = readLine()?.components(separatedBy: " ") else { return }
    n = input.map { Int($0) }[0] ?? 0
    k = input.map { Int($0) }[1] ?? 0
    var result: [Int] = Array(repeating: 0, count: n + 10)
    
    //MARK: - Process & Output
    getBinary(0, &result)
}
solution()

 

전체코드는 여기에서 확인할 수 있습니다.