๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm๐Ÿฐ/๋ฐฑ์ค€

[๋ฐฑ์ค€] Swift 2529 ๋ถ€๋“ฑํ˜ธ backtracking

by Jouureee 2022. 4. 7.

๋ฌธ์ œ : 

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

 

2529๋ฒˆ: ๋ถ€๋“ฑํ˜ธ

๋‘ ์ข…๋ฅ˜์˜ ๋ถ€๋“ฑํ˜ธ ๊ธฐํ˜ธ ‘<’์™€ ‘>’๊ฐ€ k๊ฐœ ๋‚˜์—ด๋œ ์ˆœ์„œ์—ด A๊ฐ€ ์žˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ๋ถ€๋“ฑํ˜ธ ๊ธฐํ˜ธ ์•ž๋’ค์— ์„œ๋กœ ๋‹ค๋ฅธ ํ•œ ์ž๋ฆฟ์ˆ˜ ์ˆซ์ž๋ฅผ ๋„ฃ์–ด์„œ ๋ชจ๋“  ๋ถ€๋“ฑํ˜ธ ๊ด€๊ณ„๋ฅผ ๋งŒ์กฑ์‹œํ‚ค๋ ค๊ณ  ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ œ์‹œ

www.acmicpc.net

 

๋ถ„์„ :

ํ˜ผ์ž์„œ ํ’€์ง€ ๋ชปํ–ˆ๋‹ค .. ใ…œ

๋ถ€๋“ฑํ˜ธ์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ค‘๋ณต ์—†๋Š” ์กฐํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค. 

๊ทธ๋Ÿฌํ•œ ์กฐํ•ฉ๋“ค ์ค‘ ์ตœ๋Œ€ ๊ฐ’, ์ตœ์†Œ ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๊ฒŒ ๋‹ต์ด์˜€๋‹ค !

 

์šฐ์„  ๋ถ€๋“ฑํ˜ธ ๊ฐœ์ˆ˜ + 1๊ฐœ๋งŒํผ์˜ ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์กฐ๊ฑด ๋งŒ์กฑ์‹œ answer ๋ฐฐ์—ด์— ๋‹ด๋Š”๋‹ค.

๊ทธ๋ฆฌ๊ณ  for ๋ฌธ 0 ~ 9 10๊ฐœ์˜ ์ˆซ์ž์— ๋Œ€ํ•ด ์ฒซ๋ฒˆ์งธ ์ˆซ์ž์ผ ๊ฒฝ์šฐ๋Š” ๋ถ€๋“ฑํ˜ธ ์กฐ๊ฑด์„ ์ฒดํฌํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์ˆซ์ž๋ฅผ ๋„ฃ๋Š”๋‹ค.

๊ทธ ๋‹ค์Œ index๊ฐ€ 1์ด์ƒ์ผ๋•Œ ๋ถ€ํ„ฐ๋Š” ์ฒซ๋ฒˆ์งธ ์ˆซ์ž, ์ฒซ๋ฒˆ์งธ ๋ถ€๋“ฑํ˜ธ, ๋‘๋ฒˆ์งธ ์ˆซ์ž 3๊ฐœ๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ•ด signCheck ํ•จ์ˆ˜๋ฅผ ๊ฑฐ์นœ๋‹ค. 

< ๊ธฐํ˜ธ์ผ๋• num2๊ฐ€ ๋” ์ปค์•ผ ํ•˜๊ณ , > ๊ธฐํ˜ธ์ผ๋• num1์ด ๋” ์ปค์•ผ ํ•œ๋‹ค. 

swift์—์„  character.asciiValue์‹œ ์•„์Šคํ‚ค ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค ์—ฌ๊ธฐ์— 0 ์•„์Šคํ‚ค ๊ฐ’์ธ 48๋งŒํผ ๋นผ์ฃผ์–ด intํ˜•์œผ๋กœ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด 

2

< >

์™€ ๊ฐ™์ด input์ด ๋“ค์–ด์™”์„๋•Œ

0 < 1 ๊นŒ์ง€ ์ž…๋ ฅ ๋ฐ›์€ ์ƒํƒœ๋ผ๊ณ  ํ•ด๋ณด์ž

๋‹ค์Œ backtracking ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด index = 2, num1 = 1, num2 = 2์ผ ๊ฒƒ์ด๋‹ค. ์ด๋•Œ num1 > num2(2 ~9)๊นŒ์ง€ ์กฐ๊ฑด์ด ์„ฑ๋ฆฝํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ for๋ฌธ์ด ๋๋‚ ๊ฒƒ์ด๊ณ  num1 = 1 ์ธ ๊ฒฝ์šฐ๋กœ ๋Œ์•„์™€ boolArr[1] ์˜ ๊ฐ’์„ false(์„ ํƒ ์•ˆํ•œ ๊ฐ’)์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋’ค,

๋‹ค์Œ for๋ฌธ์œผ๋กœ num1 ๊ฐ’์€ 2๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค. 

 

answer์—๋Š” ๋ถ€๋“ฑํ˜ธ์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” string๋“ค๋งŒ ๋“ค์–ด ์žˆ๊ฒŒ ๋  ๊ฒƒ์ด๊ณ , ๋งˆ์ง€๋ง‰์— sortํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ •๋ ฌ ํ•ด์ค€ ๋’ค, max ๊ฐ’๊ณผ min๊ฐ’์„ ์ถœ๋ ฅํ•ด์ค€๋‹ค.

 

swift ์ฝ”๋“œ :

//
//  main.swift
//  SOMA๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป
//
//  Created by JoSoJeong on 2022/03/31.
//

import Foundation

var n = Int(readLine()!)!
var signArr: [String] = readLine()!.split(separator: " ").map { String($0) }
var boolArr:[Bool] = Array(repeating: false, count: 10)
var answer: [String] = []

func signCheck(_ num1: Character, _ num2: Int, _ sign: String) -> Bool {
    if(sign == "<") {
        if(num1.asciiValue! - 48 > num2) { return false }
    }else {
        if(num1.asciiValue! - 48 < num2) { return false }
    }
    return true
}

func backTracking_sign(_ index: Int, _ s: String){
    if(index == n+1) {
        answer.append(s)
        return
    }
    
    for i in 0...9 {
        if(boolArr[i]) { continue } // ์ด๋ฏธ ์‚ฌ์šฉํ•œ ์ˆซ์ž
        if(index == 0){
            boolArr[i] = true
            backTracking_sign(index+1, "\(s)\(i)") // ๋‹ค๋ฆ„ ์ž๋ฆฌ, ๋‹ค์Œ ์ˆซ์ž
            boolArr[i] = false
        }else {
            let num1 = s[s.index(s.startIndex, offsetBy: index - 1)]
            let num2 = i
            if(signCheck( num1, num2, signArr[index-1])) {
                boolArr[i] = true
                backTracking_sign(index+1, "\(s)\(i)") // ๋‹ค๋ฆ„ ์ž๋ฆฌ, ๋‹ค์Œ ์ˆซ์ž
                boolArr[i] = false
            }
        }

    }
}

backTracking_sign(0, "")
answer.sort()

print(answer.last!) //  max ๊ฐ’
print(answer.first!) // min ๊ฐ’

๋Œ“๊ธ€