Swift Data Structure And Algorithm/Recursive Function

goodseq

youngjaeLee1026 2022. 4. 7. 16:32

1. 문제

스크란샷 2022-04-07 16 29 46

2. μž…μΆœλ ₯

스크란샷 2022-04-07 16 29 54

3. μž…μΆœλ ₯ μ˜ˆμ‹œ

스크란샷 2022-04-07 16 30 02

4. 문제 섀계

  • N이 80μ΄λ―€λ‘œ, 완전탐색(Back-tracking)으둜 문제λ₯Ό ν•΄κ²°ν•  수 있음
  • κ°€μž₯ μž‘μ€ 수λ₯Ό λ‚˜νƒœλ‚΄λŠ” μˆ˜μ—΄λ§Œ 좜λ ₯ν•˜κΈ° μœ„ν•΄μ„œ κ°€μž₯ μž‘μ€ 수인 1λΆ€ν„° μ°¨λ‘€λ‘œ λ†“μ•˜μ„ λ•Œ, 졜초둜 μ™„μ„±λ˜λŠ” μˆ˜μ—΄μ„ 좜λ ₯ν•˜λ©΄ λ˜λŠ” 것을 μ•Œ 수 있음
  • 각 자리자리 λ§ˆλ‹€ 1λΆ€ν„° 수λ₯Ό λ†“μŒμœΌλ‘œμ¨ ν•΄λ‹Ή 수λ₯Ό ν¬ν•¨ν•˜λŠ” μ—°μ†λ˜λŠ” λΆ€λΆ„μ—μ„œ 쀑볡이 μ—†λ‹€λ©΄ λ‹€μŒ 숫자λ₯Ό λ†“μœΌλ©΄ 되고, κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ λ‹€μ‹œ λ˜λŒμ•„μ™€(Back-tracking) λ‹€μŒ 숫자λ₯Ό 놓아 ν•˜λ‚˜ν•˜λ‚˜ 일일히 ν•΄λ΄„μœΌλ‘œμ¨ 문제λ₯Ό ν•΄κ²°ν•  수 있음
  • ν•΄λ‹Ή 수λ₯Ό ν¬ν•¨ν•˜λŠ” μ—°μ†λ˜λŠ” λΆ€λΆ„μ—μ„œ 쀑볡이 μ—†λŠ”μ§€ κ²€μ‚¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” ν˜„μž¬ 놓아야 ν•˜λŠ” μˆ«μžκ°€ κ°€μž₯ 끝의 μœ„μΉ˜ν•΄ μžˆμ„ 것이고, μ—°μ†λ˜λŠ” ꡬ간을 1λΆ€ν„° (ν˜„μž¬ μœ„μΉ˜ + 1) / 2 κΉŒμ§€μ˜ ꡬ간을 κ²€μ‚¬ν•˜κ²Œ 되면 μ•Œ 수 있음
  • κ°€λ Ή, [1, 2, ] λ‹€μŒμ— 숫자λ₯Ό 놓아야 ν•  경우, ν˜„μž¬ μœ„μΉ˜λŠ” 2이고, ꡬ간 1λΆ€ν„° (2 + 1) / 2 = 1 κΉŒμ§€ μžμ‹  λΆ€ν„° ꡬ간 만큼 λ–¨μ–΄μ§„ 곳의 μ›μ†Œκ°€ μ€‘λ³΅λ˜λŠ”μ§€λ§Œ κ²€μ‚¬ν•˜λ©΄ λ˜λŠ” 것을 μ•Œ 수 있음

5. 전체 μ½”λ“œ

//MARK: - goodseq

//MARK: - Framework
import Foundation

//MARK: - Variable
var isFinished: Bool = false

//MARK: - Function
func isPossible(_ result: [Int], _ current: Int, _ interval: Int) -> Bool {
    var flag: Bool = false
    
    for i in 0..<interval {
        if result[current - i] != result[current - i - interval] {
            flag = true
            break
        }
    }
    
    return flag
}

func getGoodSeq(_ result: inout [Int], _ N: Int, _ current: Int) -> Void {
    if isFinished { return }
    
    if current >= N {
        var answer: String = ""
        for number in result {
            answer += "\(number)"
        }
        print(answer)
        isFinished = true
    } else {
        for i in 1...3 {
            var flag: Bool = false
            result[current] = i
            
            for j in stride(from: 1, through: (current + 1) / 2, by: 1) {
                if !isPossible(result, current, j) {
                    flag = true
                    break
                }
            }
            
            if !flag {
                getGoodSeq(&result, N, current + 1)
            }
        }
    }
}

func solution() -> Void {
    //MARK: - Input
    guard let N: Int = Int(readLine() ?? "0") else { return }
    var result: [Int] = Array(repeating: 0, count: N)
    
    //MARK: - Process & Output
    getGoodSeq(&result, N, 0)
}
solution()

 

μ „μ²΄μ½”λ“œλŠ” μ—¬κΈ°μ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

'Swift Data Structure And Algorithm > Recursive Function' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

κ±°λ“­ 제곱 κ΅¬ν•˜κΈ° L  (0) 2022.04.07
mountain  (0) 2022.03.14
νŒ©ν† λ¦¬μ–Ό  (0) 2022.03.14
binary  (0) 2022.01.29