서론 및 문제
요즘에는 프로그래머스를 통해 문제를 풀고있다. 0 대충 보고 얕잡아 봤는데 정답률 60미만인 것들은 호락호락 하지 않는 것을 확인했다. 레벨 0, 그렇게 안봤는데 생각보다 무서운 문제였다. 아무튼 이번에는 프로그래머스 레벨 0에서 가장 극악의 정답률을 자랑하는 옹알이 (1)을 풀어보고자 한다. 현재 37%의 정답률을 자랑하고 있다. 문제는 다음과 같다. 사이트에서 문제를 풀려면 여기로 가면 된다. 아래 문제를 보고 직접 풀어본 뒤, 아래 내 풀이 과정을 참고 바란다.
문제 설명
머쓱이는 태어난 지 6개월 된 조카를 돌보고 있습니다.
조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음을 최대 한 번씩 사용해 조합한(이어 붙인) 발음밖에 하지 못합니다.
문자열 배열 babbling이 매개변수로 주어질 때,
머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.
문제 풀이 및 설명
"머쓱아..." 라는 소리가 절로 나온다. 근데 레벨 0답게 조합이라는 단어를 던져줬다. 심지어(이어붙인)이란다. 그래서 곧바로 permutation을 떠올리게 되었다. 아래와 같이 4개의 가능한 단어를 1개의 조합부터(최소1개랬으니) 4개의 조합까지 다 구한 것이다. 그리고 각 조합을 구할때마다 able_ans에 append했다. 이때만 해도 이제 join해야지라는 생각을 했다.
able_ans=[]
for i in range(1,5):
res = list(permutations(["aya", "ye", "woo", "ma"], i))
able_ans.append(res)
이런 생각도 찰나, 바로 join을 하니까 자료가 중첩 구조가 되어 호락호락하게 join되지 않았다. 그러니까 [[('aya', 'ye')], [('woo',)], [('ma', 'ye', 'aya')]] 이런식으로 되어 있으니, 하나를 뺐을 때 str로 join해야되는데 tuple이 나와 에러가 뜨는 것이었다. 그래서 아래 코드를 추가하여 1) 튜플인 경우는 그대로 join한 뒤, 결과에 append했고, 2) list인 경우 다시 for 문을 돌려 튜플인지 확인하고 맞다면 join해서 append하는 식으로 진행했다. 이걸 진행한 코드가 아래와 같다.
bab_array=[]
for item in able_ans:
if isinstance(item, tuple):
result.append(''.join(item))
elif isinstance(item, list):
for subitem in item:
if isinstance(subitem, tuple):
bab_array.append(''.join(subitem))
이제 입력 받은 것을 위에 있는 bab_array에 더한다. 왜냐 set을 하면 겹치는 만큼 사라지기 때문. 그리고 그 사라진 만큼 겹친다고 판단하고 return을 했다. return len(bab_array) - len(set(bab_array)) 이렇게 말이다. 이러한 과정으로, 최종 코드는 다음과 같다.
from itertools import permutations
def solution(babbling):
able_ans=[]
for i in range(1,5):
res = list(permutations(["aya", "ye", "woo", "ma"], i))
able_ans.append(res)
bab_array=[]
for item in able_ans:
if isinstance(item, tuple):
result.append(''.join(item))
elif isinstance(item, list):
for subitem in item:
if isinstance(subitem, tuple):
bab_array.append(''.join(subitem))
for k in babbling:
bab_array.append(k)
return len(bab_array) - len(set(bab_array))
끝으로
원래 서론에 썼어야 됐는데 적다보니 놓쳤다. 본 문제의 풀이 과정은 1. "aya", "ye", "woo", "ma"로 가능한 조합을 모두 구한 뒤 2. 입력받은 babbling list를 1.에서 구한 조합에 더한다. 3. set하기 전과 set한 후 차이를 return한다. 끝으로, 정말 나는 이게 0의 레벨인지.. 다른 레벨0 문제들은 5줄정도 되는 코드 중간에 구멍 하나 뚫어서 오류 찾고 그런건데 이 문제가 과연 0으로 온게 제대로 된게 맞는지 의문이 생긴다. 그들의 저의는 뭘까...
'IT, Computer' 카테고리의 다른 글
[GCP] MLOps framework for 생성형 AI (2) (0) | 2025.05.07 |
---|---|
[GCP] GCP 튜토리얼을 무료로 제공하는 사이트가 있다? (1) (0) | 2025.05.06 |
LLM 모델별(gpt, gemini, claude 등) 성능 비교하는 법 (0) | 2025.05.01 |
파이썬 제너레이터(generator), yield Python (0) | 2025.04.30 |
티스토리 hELLO 스킨 적용 방법 (0) | 2025.04.10 |