[백준] 암호 만들기 (1759)

문제 설명

백준 1759번 문제 링크

입력 및 출력

» 입력

첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.

» 출력

각 줄에 하나씩, 사전식으로 가능성 있는 암호를 모두 출력한다.

예제 입출력(테스트케이스)

입력 출력
4 6
a t c i s w
acis
acit
aciw
acst
acsw
actw
aist
aisw
aitw
astw
cist
cisw
citw
istw

문제 풀이(SWIFT) 1

//
//  main.swift
//  BOJ1759_SWIFT
//
//  Created by choiyoujun on 2022/02/22.
//

let LC = readLine()!.split(separator: " ").map { Int($0)! }
let L = LC[0]
let C = LC[1]
let tVowels = ["a", "e", "i", "o", "u"]
var vowel = [Bool](repeating: false, count: 26)
var consonant = [Bool](repeating: false, count: 26)
var check = [Bool](repeating: false, count: 26)
var pw = readLine()!.split(separator: " ")
var vowelCount = 0
var consonantCount = 0

for ch in pw {
    let us = ch.unicodeScalars.first!
    let unic = Int(us.value) - 97
    
    if tVowels.contains(String(us)) {
        vowel[unic] = true
    } else {
        consonant[unic] = true
    }
    check[unic] = true
}

for i in 0..<26 {
    if vowel[i] {
        vowelCount += 1
    }
    
    if consonant[i] {
        consonantCount += 1
    }
}

func dfs(vCount: Int, cCount: Int, pw: String, index: Int) -> Void {
    if vCount >= 1 && cCount >= 2 {
        if pw.count == L {
            print(pw)
            return
        }
    }
    
    for i in index..<26 {
        if check[i] {
            check[i] = false
            let ch = String(UnicodeScalar(97 + i)!)
            
            if vowel[i] {
                dfs(vCount: vCount + 1, cCount: cCount, pw: pw + ch, index: i + 1)
            } else {
                dfs(vCount: vCount, cCount: cCount + 1, pw: pw + ch, index: i + 1)
            }
            
            check[i] = true
        }
    }
}

dfs(vCount: 0, cCount: 0, pw: "", index: 0)

태그:

카테고리:

업데이트: