경험의 기록

문제 : https://www.acmicpc.net/problem/1759

 

1759번: 암호 만들기

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

www.acmicpc.net

 

import java.util.*

var l = 0
var c = 0
val array = arrayListOf<String>()
var arr = arrayListOf<String>()

fun main() = with(Scanner(System.`in`)){
    l = nextInt()
    c = nextInt()

    // 첫자리 체크 (두 수의 차보다 높은 자리수는 뒤에 알파벳이 모자라므로 안해도 됨)
    val sul = c-l

    for(i in 0 until c){
        array.add(next())
    }

    // 정렬
    array.sort()

    for(i in 0 .. sul){
        find(i,"",0,0)
    }

    arr.distinct().forEach { println(it) } // 결과물 출력
}

fun find(position: Int, sum: String, vowel: Int, consonant: Int){

    // 결과물이 조건이 맞지 않으면 넣지않음
    if(sum.length == l){
        if(vowel >=1 && consonant >= 2){
            arr.add(sum)
        }
        return
    }

    for(i in position until c){

        // 자음 모음 판별
        if(array[i] == "a" || array[i] == "e" ||
            array[i] == "i" || array[i] == "o" ||
            array[i] == "u"){
            find(i+1,sum+array[i],vowel+1,consonant)
        }
        else{
            find(i+1,sum+array[i],vowel,consonant+1)
        }
    }
}

DFS를 사용하여 문자열을 완성 후

조건에 맞지 않는 문자열을 제거하였다.

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading