새로운 블로그로 이전 작업을 진행하고 있어 포스트가 새로 작성되고 있지 않습니다.

빠른 시일 내에 새로운 블로그로 인사드리겠습니다.

새로운 블로그 : https://unho.vercel.app/

본문 바로가기
알고리즘 문제풀이/Python

[백준] 1759 암호 만들기

by 언호 2022. 1. 1.

📖 문제


 

🧑🏻‍💻 풀이 과정

1) 문제 이해 및 접근

암호가 알파벳 증가하는 순서로 배열되었다고 하므로, 초기에 알파벳들을 사전순으로 사전 정렬

문제의 해당 조건에 충족하는 모든 문자를 찾아야하므로 완전 탐색으로 접근

2) 알고리즘

  • 완전 탐색 (Brute force)

3) 풀이 코드

사용 언어 - Python

import sys
sys.stdin = open('input.txt')


def solution(n, idx, ans):                          # 현재 알파벳 선택한 개수, 시작할 인덱스 번호, 지금까지 만든 단어
    global vowel_cnt, consonant_cnt

    if n >= L:                                      # 원하는 길이 만들어졌으면 확인
        if vowel_cnt and consonant_cnt >= 2:        # 모음이 1개 이상, 자음이 2개 이상으로 만들어 진 경우
            answer.append(''.join(ans))             # 정답 리스트에 추가
        return
    

    for c in range(idx, C):                         # 이전에 끝난 인덱스 이후부터 시작
        if not selected[c]:
            selected[c] = 1

            if character_list[c] in vowel:          # 모음이면 모음 개수 카운트 증가, 자음이면 자음 개수 카운트 증가
                vowel_cnt += 1
            else:                                  
                consonant_cnt += 1

            ans.append(character_list[c])           # 알파벳 추가
            solution(n+1, c+1, ans)                 # 다음 알파벳 찾으러 재귀
            ans.pop()                               # 알파벳 제거

            if character_list[c] in vowel:          # 모음, 자음 종류에 맞게 개수 카운트 감소
                vowel_cnt -= 1
            else:
                consonant_cnt -= 1

            selected[c] = 0


L, C = map(int, sys.stdin.readline().split())           # 문자의 길이, 문자들의 총 개수
character_list = sorted(sys.stdin.readline().split())   # 문자들 리스트 (사전순으로 단어를 만들어야하므로 사전순 정렬)
vowel = set(['a', 'e', 'i', 'o', 'u'])                  # 모음 리스트
selected = [0] * C                                      # 특정 알파벳 사용 여부

vowel_cnt = 0               # 모음 개수 카운트 변수
consonant_cnt = 0           # 자음 개수 카운트 변수
answer = []                 # 정답 리스트

solution(0, 0, [])          # 완전 탐색

print('\n'.join(answer))    # 출력

📝 결과 및 학습한 내용

1) 어려웠던 내용

특별히 없었습니다.

2) 새롭게 학습한 내용

특별히 없었습니다.


🔗 문제 링크

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

 

1759번: 암호 만들기

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

www.acmicpc.net

 

 

※ 오류 및 오타, 다른 의견이 있는 경우 댓글을 남겨주시면 감사하겠습니다

'알고리즘 문제풀이 > Python' 카테고리의 다른 글

[백준] 1043 거짓말  (0) 2022.01.03
[백준] 9663 N-Queen  (0) 2022.01.02
[백준] 10819 차이를 최대로  (0) 2021.12.31
[백준] 7662 이중 우선순위 큐  (0) 2021.12.30
[백준] 1747 소수&팰린드롬  (0) 2021.12.29

댓글