본문 바로가기

Algorithm/BOJ

[BOJ] 1759. 암호 만들기

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

 

1759번: 암호 만들기

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

www.acmicpc.net

 

 

1. 해결방법

"""
1. 아이디어
- 최소 1개 이상의 모음(a e i o u)과 최소 2개 이상의 자음으로 구성되어 있고, 오름차순으로 정렬을 한다.
- if문으로 먼저 1개 이상의 모음을 구하고, 그 다음은 자음 2개 이상을 조건화 한다.
- 원소 중복이 일어나면 안되기 때문에 방문기록을 체크할 것이다.

2. 시간복잡도

3. 자료구조
- 백트래킹 : 재귀
"""

 

 

2. 정답코드

입력 예제(1)

4 6
a t c i s w

출력 예제(1)

acis
acit
aciw
acst
acsw
actw
aist
aisw
aitw
astw
cist
cisw
citw
istw

 

코드

# input
L, C = map(int, input().split())
pwd = sorted(list(map(str, input().split())))

chk = [False for _ in range(C)]
answer = []
cnt1 = 0
cnt2 = 0


# recur
def recur(depth, idx):
    global cnt1, cnt2

    # 재귀 종료 지점
    if depth == L:
        cnt1 = 0
        cnt2 = 0

        # 현재 append된 answer 리스트르 for문으로 돌면서 모음 그리고 자음의 카운트를 +1씩 해준다.
        for i in range(L):
            if answer[i] in ['a', 'e', 'i', 'o', 'u']:
                cnt1 += 1
            else:
                cnt2 += 1
        # 모음 1개, 자음 2개 이상일 경우 출력, print
        if cnt1 >= 1 and cnt2 >= 2:
            print(''.join(map(str, answer)))
        return


    # 재귀
    for i in range(idx, C):
        if chk[i] == False:
            answer.append(pwd[i])
            chk[i] = True
            recur(depth + 1, i + 1)
            answer.pop()
            chk[i] = False


# mian
recur(0, 0)
import sys
from itertools import permutations, combinations

input = sys.stdin.readline

L, C = map(int, input().split())
chars = sorted(list(map(str, input().split())))
chk = [False] * C

char_list = []
for perm in combinations(chars, L):
    a, b = 0, 0
    for c in perm:
        if c in ['a', 'e', 'i', 'o', 'u']:
            a += 1
        else:
            b += 1
    if a >= 1 and b >= 2:
        print(''.join(map(str, perm)))

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 10819. 차이를 최대로  (0) 2022.06.24
[BOJ] 7576. 토마토  (0) 2022.06.24
[BOJ] 9663. N-Queen  (0) 2022.06.22
[BOJ] 1012. 유기농 배추  (0) 2022.06.22
[BOJ] 1182. 부분수열의 합  (0) 2022.06.21