도토리 줍는 개발자 김지무

프로그래머스 위클리챌린지 5주차_모음사전 파이썬 -jimoo 본문

알고리즘공부

프로그래머스 위클리챌린지 5주차_모음사전 파이썬 -jimoo

지무 2021. 9. 20. 19:39
728x90
반응형

https://programmers.co.kr/learn/courses/30/lessons/84512?language=python3 

 

코딩테스트 연습 - 5주차_모음사전

사전에 알파벳 모음 'A', 'E', 'I', 'O', 'U'만을 사용하여 만들 수 있는, 길이 5 이하의 모든 단어가 수록되어 있습니다. 사전에서 첫 번째 단어는 "A"이고, 그다음은 "AA"이며, 마지막 단어는 "UUUUU"입니

programmers.co.kr

안녕하세요~~ 오늘은 프로그래머스 위클리챌린지 5주차_모음사전 문제 리뷰하도록 하겠습니다.

 

이번 문제는 중복순열 문제입니다!!!

중복순열은 서로다른 n개중에 r개를 중복을 허용하여 나열하는 경우입니다.

 

파이썬 표준 라이브러리인 itertools는 순열(permutations()), 조합(combinations()), product 등의 함수를 제공합니다. 

 

저는 cartesian product(데카르트 곱)인 product() 함수를 사용하여 중복조합을 구현했습니다.

 

* 데카르트 곱이란?

A집합의 원소 x와 B집합의 원소 y의 순서쌍들의 집합이다.

각 집합에 있는 모든 원소들이 서로 만날 수 있어 모든 경우의 수의 쌍이 만들어진다. 예를 들어 설명하자면

A = [a,b,c]  B = [1,2,3] 의 데카르트 곱은

AXB = [[a,1],[a,2],[a,3],[b,1],[b,2],[b,3],[c,1],[c,2],[c,3]] 이 된다.

 

이제 코드에 대해 설명하도록 하겠다~

 

파이썬 표준 라이브러리 itertools의 함수인 product의 파라미터에 대해 설명하겠다.

product(A,B, repeat=숫자)

A,B은 순서쌍을 구하고자 하는 집합(배열)들을 나타낸다. 하나 이상의 배열을 적을 수 있다. 

repeat은 몇 개의 원소를 뽑아 나열할 것인지 설정하는 파라미터이다.

서로다른 n개중에 r개를 중복을 허용하여 나열하고자 할 때 repeat = r을 작성해주면 된다.

 

아래는 사전의 단어를 만들기 위한 코드이다. (A, AA, AAA, ...., UUUUU)

for i in range(1,6):

      for k in product(alpa,repeat=i):
            st = "".join(k)
            w.append(st)

 

1개, 2개, ..., 5개의 원소를 뽑은 경우의 수를 모두 나열해야 하기 때문에 for i in range(1,6)으로 작성했다.

i는 1,2,3,4,5의 값을 가질 수 있고 이 i의 값을 repeat에 대입했다. 그러면 1~5개의 중복순열을 얻을 수 있다.

 

k는 alpa 배열에서 i개의 원소를 뽑아 만든 중복순열의 결과를 얻는다.

product(alpa = "AE", repeat = 2) 를 예시로 들었을 때 중복 순열의 결과는 ("A","A") ("A","E") ("E","E") 인 튜플 값을 얻게된다. 이때 k는 총 3번 튜플을 접근할 수 있다. 

각 튜플을 접근하면서 k가 ("A","A") 값을 가질 때 "".join(k)를 사용하여 "AA"인 string값으로 변경해주고 사전인 w 배열에 append해준다.

 

반복문이 끝나면 w에 모든 사전의 단어들이 저장된다. 이후 sort()함수를 사용하여 값을 오름차순으로 정렬해주고 찾고자 하는 word가 몇 번째에 있는지 return해준다. (배열의 인덱스는 0부터 시작하기 때문에 찾은 인덱스위치+1을 해줘야한다.)

 

 

전체코드

from itertools import product
def solution(word):
    answer = 0
    alpa = "AEIOU"
    w =[]
    for i in range(1,6):
        for i in product(alpa,repeat=i):
            st = "".join(i)
            w.append(st)
            
    w.sort()
    
    answer = w.index(word)+1
    return answer
728x90
반응형
Comments