본문 바로가기
알고리즘 풀기

[백준] 1759 암호 만들기 python3

by 쏘야.yap 2020. 3. 18.
728x90

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

 

1759번: 암호 만들기

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

www.acmicpc.net

 

코드

import sys
sys.setrecursionlimit(10**8) # 10^8 까지 늘림.
input = sys.stdin.readline


def is_correct_password(password):
    vowel = 0
    consonant = 0
    for p in password:
        if p in 'aeiou':
            vowel += 1
        else:
            consonant += 1

    if vowel >= 1 and consonant >= 2:
        return True
    return False


def backtracking(idx, password):
    # password 가 다 채워졌을 때
    if idx == L:
        # 조건 검사
        if is_correct_password(password):
            print("".join(password))
            return

    for i in range(len(characters)):
        # 이미 들어가있는 글자면
        if checked[i]:
            continue

        # 오름차순 정렬이 아니면
        if idx > 0 and ord(password[-1]) > ord(characters[i]):
            continue

        # 패스워드에 추가하고
        password += characters[i]
        checked[i] = True

        # 백트래킹
        backtracking(idx+1, password)

        # 돌아오면 다시 돌려놈
        checked[i] = False
        password = password[:-1]


L, C = map(int, input().split(" "))
characters = sorted(list(map(str, input().strip().split(" "))))

checked = [False] * C

backtracking(0, '')

 

 

'알고리즘 풀기' 카테고리의 다른 글

BOJ 1088 쉬운 계단 수 python3  (0) 2020.04.17
BOJ 1149 RGB거리 python3  (0) 2020.04.17
[백준] 6603 로또 python3  (0) 2020.03.14
[백준] 15649 N과 M python3  (0) 2020.03.14