Swift Data Structure And Algorithm/Back-tracking(Advanced Brute-Force)

inequal

youngjaeLee1026 2022. 3. 31. 12:41

1. ๋ฌธ์ œ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-03-31 12 34 12

2. ์ž…์ถœ๋ ฅ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-03-31 12 34 34

3. ์ž…์ถœ๋ ฅ ์˜ˆ์‹œ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-03-31 12 34 53

4. ๋ฌธ์ œ ์„ค๊ณ„

  1. ๋ถ€๋“ฑํ˜ธ์˜ ๊ฐœ์ˆ˜(k) + 1 ๋งŒํผ 0 ~ 9 ์‚ฌ์ด์˜ ์ •์ˆ˜๋ฅผ ์ „๋ถ€ ๋†“์•„๋ณด๋ฉด์„œ ๋ถ€๋“ฑํ˜ธ ๊ด€๊ณ„๋ฅผ ๋น„๊ตํ•ด์•ผ ํ•˜๋ฏ€๋กœ,
  2. k + 1๊ฐœ ๋งŒํผ์˜ ์ค‘์ฒฉ ๋ฐ˜๋ณต๋ฌธ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ Back-tracking ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ 
  3. ๊ฐ€๋Šฅํ•œ ๋‹ต์˜ ๊ฐœ์ˆ˜๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ ์กด์žฌํ•˜๋ฏ€๋กœ ๊ทธ ์ค‘์—์„œ ์ตœ๋Œ€๊ฐ’ ์ตœ์†Œ๊ฐ’์„ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ๋Š” 9๋ถ€ํ„ฐ(์ตœ๋Œ€๊ฐ’) ์ˆซ์ž๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ ,
  4. 0๋ถ€ํ„ฐ(์ตœ์†Œ๊ฐ’) ์ˆซ์ž๋ฅผ ๊ฒฐ์ •ํ•จ์œผ๋กœ์จ ๊ฐ๊ฐ์„ ์–ป์„ ์ˆ˜ ์žˆ์Œ
  5. ์ˆœ์—ด๊ตฌํ•˜๊ธฐ ๋ฌธ์ œ์—์„œ ์ฒ˜๋Ÿผ ์ค‘๋ณต์„ ํ™•์ธํ•˜๋ฉด์„œ ๋ถ€๋“ฑํ˜ธ ๊ด€๊ณ„๊ฐ€ ๋งŒ์กฑํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•ด์•ผ ํ•˜๊ณ , ์ตœ์ดˆ๋กœ ๊ฒฐ์ •๋˜๋Š” ์ˆซ์ž๊ฐ€ ์ตœ๋Œ€๊ฐ’ ์ตœ์†Œ๊ฐ’ ์ด๋ฏ€๋กœ 
  6. Bool ๋ณ€์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋‘์–ด ์ตœ์ดˆ๋กœ ์™„์„ฑ๋˜์—ˆ์„ ๋•Œ true๋กœ ๊ฐ’์„ ๋ฐ”๊ฟ”์ฃผ๊ณ , ์žฌ๊ท€ํ•จ์ˆ˜๋Š” Bool ๋ณ€์ˆ˜์˜ ๊ฐ’์ด true๊ฐ€ ๋˜๋ฉด ์ข…๋ฃŒ๋˜๋„๋ก ๊ตฌํ˜„ํ•จ

5. ์ „์ฒด ์ฝ”๋“œ

//MARK: - inequal

//MARK: - Framework
import Foundation

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

//MARK: - Function
func getMaxInequal(_ A: [String], _ current: Int, _ k: Int, _ lowerBound: Int, _ upperBound: Int, _ result: inout [Int], _ check: inout [Bool]) -> Void {
    if flag {
        return
    }
    
    if current >= k + 1 {
        var answer: String = ""
        for number in result {
            answer += "\(number)"
        }
        print(answer)
        flag = true
    } else {
        for i in stride(from: upperBound, through: lowerBound, by: -1) {
            if !check[i] {
                var isPossible: Bool = true
                
                if current == 0 {
                    isPossible = true
                } else {
                    switch A[current - 1] {
                    case "<":
                        isPossible = result[current - 1] > i ? false : true
                    case ">":
                        isPossible = result[current - 1] < i ? false : true
                    default:
                        break
                    }
                }
                
                if isPossible {
                    result[current] = i
                    check[i] = true
                    getMaxInequal(A, current + 1, k, lowerBound, upperBound, &result, &check)
                    check[i] = false
                }
            }
        }
    }
}

func getMinInequal(_ A: [String], _ current: Int, _ k: Int, _ lowerBound: Int, _ upperBound: Int, _ result: inout [Int], _ check: inout [Bool]) -> Void {
    if flag {
        return
    }
    
    if current >= k + 1 {
        var answer: String = ""
        for number in result {
            answer += "\(number)"
        }
        print(answer)
        flag = true
    } else {
        for i in lowerBound...upperBound {
            if !check[i] {
                var isPossible: Bool = true
                
                if current == 0 {
                    isPossible = true
                } else {
                    switch A[current - 1] {
                    case "<":
                        isPossible = result[current - 1] > i ? false : true
                    case ">":
                        isPossible = result[current - 1] < i ? false : true
                    default:
                        break
                    }
                }
                
                if isPossible {
                    result[current] = i
                    check[i] = true
                    getMinInequal(A, current + 1, k, lowerBound, upperBound, &result, &check)
                    check[i] = false
                }
            }
        }
    }
}

func solution() -> Void {
    //MARK: - Input
    guard let k: Int = Int(readLine() ?? "0") else { return }
    guard let A: [String] = readLine()?.components(separatedBy: " ") else { return }
    let lowerBound: Int = 0
    let upperBound: Int = 9
    
    var result: [Int] = Array(repeating: 0, count: k + 1)
    var check: [Bool] = Array(repeating: false, count: upperBound + 1)
    
    //MARK: - Process & Output
    getMaxInequal(A, 0, k, lowerBound, upperBound, &result, &check)
    
    check = Array(repeating: false, count: upperBound + 1)
    flag = false
    
    getMinInequal(A, 0, k, lowerBound, upperBound, &result, &check)
}
solution()

 

์ „์ฒด์ฝ”๋“œ๋Š” ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

'Swift Data Structure And Algorithm > Back-tracking(Advanced Brute-Force)' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

dessert  (0) 2022.03.31
division  (0) 2022.03.31
tobin  (0) 2022.03.31
์ˆœ์—ด๊ตฌํ•˜๊ธฐ  (0) 2022.03.31