1. ๋ฌธ์

2. ์ ์ถ๋ ฅ

3. ์ ์ถ๋ ฅ ์์

4. ๋ฌธ์ ์ค๊ณ
- ๋ถ๋ฑํธ์ ๊ฐ์(k) + 1 ๋งํผ 0 ~ 9 ์ฌ์ด์ ์ ์๋ฅผ ์ ๋ถ ๋์๋ณด๋ฉด์ ๋ถ๋ฑํธ ๊ด๊ณ๋ฅผ ๋น๊ตํด์ผ ํ๋ฏ๋ก,
- k + 1๊ฐ ๋งํผ์ ์ค์ฒฉ ๋ฐ๋ณต๋ฌธ์ด ํ์ํ๋ฏ๋ก Back-tracking ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ด ํจ์จ์
- ๊ฐ๋ฅํ ๋ต์ ๊ฐ์๊ฐ ํ๋ ์ด์ ์กด์ฌํ๋ฏ๋ก ๊ทธ ์ค์์ ์ต๋๊ฐ ์ต์๊ฐ์ ์ฐพ๊ธฐ ์ํด์๋ 9๋ถํฐ(์ต๋๊ฐ) ์ซ์๋ฅผ ๊ฒฐ์ ํ๊ณ ,
- 0๋ถํฐ(์ต์๊ฐ) ์ซ์๋ฅผ ๊ฒฐ์ ํจ์ผ๋ก์จ ๊ฐ๊ฐ์ ์ป์ ์ ์์
- ์์ด๊ตฌํ๊ธฐ ๋ฌธ์ ์์ ์ฒ๋ผ ์ค๋ณต์ ํ์ธํ๋ฉด์ ๋ถ๋ฑํธ ๊ด๊ณ๊ฐ ๋ง์กฑํ๋์ง ๊ฒฐ์ ํด์ผ ํ๊ณ , ์ต์ด๋ก ๊ฒฐ์ ๋๋ ์ซ์๊ฐ ์ต๋๊ฐ ์ต์๊ฐ ์ด๋ฏ๋ก
- 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 |