사용자 도구

사이트 도구


ps:problems:boj:1759

암호 만들기

ps
링크acmicpc.net/…
출처BOJ
문제 번호1759
문제명암호 만들기
레벨골드 5
분류

백트래킹

시간복잡도O(C(n,m)*m)
인풋사이즈n<=15, m<=15
사용한 언어Python
제출기록30864KB / 68ms
최고기록52ms
해결날짜2022/01/14

풀이

  • n개 중에서 m개를 뽑는데, 알파벳 순으로만 뽑아야 한다면, 파이썬에서는 굳이 백트래킹으로 알파벳순이 아닌것을 가지치기할 필요없이 그냥 itertools.combinations를 쓰면 된다. 이러면 nCm개의 암호 후보를 뽑을수 있고, 이중에서 모음의 갯수만 조건에 맞는지 확인하면 된다. 이것은 O(m)에 가능하므로 총 시간 복잡도는 O(C(n,m)*m)이다. 백트래킹을 구현해서 글자 한개를 선택할때마다 모음의 갯수를 업데이트해주다면 O(m)부분을 없앨수 있지만, 전체 시간복잡도에 비교해보면 별 의미 없다.

코드

"""Solution code for "BOJ 1759. 암호 만들기".

- Problem link: https://www.acmicpc.net/problem/1759
- Solution link: http://www.teferi.net/ps/problems/boj/1759

Tags: [Backtracking]
"""

import itertools

VOWELS = {'a', 'e', 'i', 'o', 'u'}


def main():
    L, C = [int(x) for x in input().split()]  # pylint: disable=unused-variable
    alphabets = input().split()

    for password in itertools.combinations(sorted(alphabets), L):
        vowel_count = sum(1 for ch in password if ch in VOWELS)
        if 1 <= vowel_count <= L - 2:
            print(''.join(password))


if __name__ == '__main__':
    main()

토론

댓글을 입력하세요:
K᠎ P B Q K
 
ps/problems/boj/1759.txt · 마지막으로 수정됨: 2022/01/14 14:05 저자 teferi