티스토리 뷰

알고리즘/백준

[BAEKJOON]1759 암호 만들기 - python

응애~ 개발자 2023. 2. 22. 11:09
728x90
반응형

문제 요약

  • 알고리즘 분류: 백트래킹
  • 난이도: Gold5
  • 문제내용:
    • 서로 다른 알파벳 L과 C개의 문자를 주어진다.
    • 최소 한 개의 모음(a, e, i, o, u)과 최소 두 개의 자음으로 구성되어 있다.
    • 정렬 되어있다.
    • 조건에 맞는 암호들을 모두 출력해라
  • 사이트 주소: https://www.acmicpc.net/problem/1759
 

1759번: 암호 만들기

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

www.acmicpc.net

문제풀이

 이번 문제는 백트레킹 문제이다. 백트레킹 관련 자세한 내용은 아래의 사이트에 참조하면된다.

https://jih3508.tistory.com/84

 

[알고리즘 이론] 백트래킹(Backtracking)

이론 이번에 볼 알고리즘은 백트래킹이다. 백트래킹을 알아두면 대부분 해를 찾는데 도움이 될것이다. 백트레킹은 탐색하는 도중 중복되거나 해를 찾는 방향이 맞지 안 맞으면 그 부분을 탐색

jih3508.tistory.com

그리고 백트레킹으로 조합을 구하는것라서 조합을 구현 하는 방법은 아래 사이트에서 확인 해보면 된다.

https://jih3508.tistory.com/116

 

[BAEKJOON]15663 N과 M (9)

문제 요약 알고리즘 분류: 백트래킹 난이도: Silver3 문제내용: 같은 수를 여러 번 골라도 된다. 길이가 M개의 수열을 예제와 같이 중복없이 사전순으로 출력해라. 사이트 주소: https://www.acmicpc.net/pr

jih3508.tistory.com

문제 접근 방법

 이번 문제는 조합 + 조건에 맞는 암호를 구하면 된다. 알파벳 순서 대로 정렬후 백트레킹 알고리즘으로 조합 L개를 구한 다음 모음 최소 한 개 이상와 자음 2개 이상를 구하면 된다. 모음 최소 한개 와 자음 2개는 알파벳 문자열에 모음 개수를 구한뒤 전체 문자열 길이와 모음 개수를 빼서 2개 이상일때 출력하는 형식으로 구현 하면 끝이다.

정리

  1. 문제에 주어진 알파벳을 정렬한다.
  2. 백트레킹 알고리즘으로 조합을 구현한다.
  3. 모음 개수를 구하고 모음 개수 1개 이상과  전체 문자열과 모음 개수를 빼서 2개 이상이면 출력한다.

Code

 이번에는 python에서 2가지 방법으로 풀것이다. 첫번째는 순수 백트레킹으로 구현한 방법이고 2번째는 combination 라이브러리를 사용하는 방법이다. 2가지 방법을 익히면 유용하게 쓰일것이다.

 

백트레킹으로 구현 한것

# 모음 개수 구하는 함수
def check_password(password):
    count = 0
    for char in password:
        if char in {"a", "e", "i", "o", "u"}:
            count += 1
    return count
        

def make_password(depth, password):
    if len(password) == L:        
        count = check_password(password)
        if count >= 1 and L - count >= 2:
            print(password)
        return
    for i in range(depth, C):
        make_password(i + 1, password + alpabet[i])


L, C = map(int, input().split())
alpabet = sorted(list(input().split()))
make_password(0, "")

combinations으로 구현 한것

from itertools import combinations

def check(a):
    count = 0
    for al in data:
        count += al in included
    return count

L, C = map(int, input().split())
alpaber = sorted(list(input().split()))
included = set({'a', 'e', 'i', 'o', 'u' })
result = []
for data in combinations(alpaber, L):
    count = check(data)
    if(count >=1 and L - count >= 2):
        result.append(sorted(data))

result.sort()
for data in result:
    print(''.join(data)

 

728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[BAEKJOON]2529 부등호  (0) 2023.03.03
[BAEKJOON]24267 카드 구매하기 2  (0) 2023.02.23
[BAEKJOON]1890 점프  (0) 2023.02.21
[BAEKJOON]1987 알파벳- Python  (0) 2023.02.20
[BAEKJOON]5014 스타트링크  (0) 2023.02.17
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함