거누의 개발노트

[파이썬] 백준 - 암호 만들기 - 1759 본문

코딩테스트

[파이썬] 백준 - 암호 만들기 - 1759

Gogozzi 2022. 5. 21. 14:08
반응형

문제

바로 어제 최백준 조교가 방 열쇠를 주머니에 넣은 채 깜빡하고 서울로 가 버리는 황당한 상황에 직면한 조교들은, 702호에 새로운 보안 시스템을 설치하기로 하였다. 이 보안 시스템은 열쇠가 아닌 암호로 동작하게 되어 있는 시스템이다.

암호는 서로 다른 L개의 알파벳 소문자들로 구성되며 최소 한 개의 모음(a, e, i, o, u)최소 두 개의 자음 {if} 으로 구성되어 있다고 알려져 있다. 또한 정렬된 문자열을 선호하는 조교들의 성향으로 미루어 보아 암호를 이루는 알파벳이 암호에서 증가하는 순서로 배열되었을 것이라고 추측된다. 즉, abc는 가능성이 있는 암호이지만 bac는 그렇지 않다. { sort }

새 보안 시스템에서 조교들이 암호로 사용했을 법한 문자의 종류는 C가지가 있다고 한다. 이 알파벳을 입수한 민식, 영식 형제는 조교들의 방에 침투하기 위해 암호를 추측해 보려고 한다. C개의 문자들이 모두 주어졌을 때, 가능성 있는 암호들을 모두 구하는 프로그램을 작성하시오.

입력

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

예제 입력

4 6
a t c i s w

예제 출력

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

처음 생각한 로직

처음에는 배열을 2개를 선언해서 4개를 자르고 남은 문자를 다른 배열에 넣어서 하나씩 꺼내면서 조합해보려고 했는데... 로직이 복잡해서 다른 풀이 방법을 생각해 봤다.

결론적으로, combinations를 사용해서 풀었다.

작성한 코드

import itertools
import sys

L, C = map(int, sys.stdin.readline().split(' '))
m = sorted((sys.stdin.readline().strip().split(' ')))
comb = list(itertools.combinations(m, L))
moeum = set(['a', 'e', 'i', 'o', 'u'])

for c in comb:
    moeumLen = len(moeum & set(c))
    if moeumLen >= 1 and L - moeumLen >= 2:
        print(''.join(c))

백준에서 확인

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

 

1759번: 암호 만들기

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

www.acmicpc.net

회고

set 함수의 교집합을 이용해서 모음의 갯수를 쉽게 카운팅 했다.

순서와 문자가 중복되지 않는 문자열의 조합을 꺼내야함.

반응형
Comments