본문 바로가기
Coding Test/Python

[프로그래머스] 튜플 Python Code

by giem 2022. 9. 1.
반응형

 

프로그래머스 튜플을 파이썬으로 풀어보겠다.

 

이번 문제의 난이도는 레벨 2고 2019년 카카오 문제다.


문제

문자열을 파싱 해서 제일 큰 리스트를 반환하면 되는데

여기서 집합의 원소 순서가 바뀔 수 있기에 한 번 더 생각을 해야 하는 문제다.


구현

문제를 차례차례 해결해 나가는 방식으로

문자열 파싱을 한 후

리스트의 크기로 정렬하고

작은 리스트부터 검사해서 결과에 추가를 했다.


코드
def solution(s):
    answer = []
    num=''
    flag=0
    for c in s[1:-1]:
        if c=='{':
            num=''
            temp=[]
            flag=1
        elif c==',' and flag:
            temp.append(int(num))
            num=''
        elif c=='}':
            temp.append(int(num))
            answer.append(temp)
            flag=0
        else:
            num+=c

    answer = sorted(answer, key=lambda x: len(x))
    result = []
    for a in answer:
        for n in a:
            if n not in result:
                result.append(n)

    return result

구현과 같이 정직하게 풀었다.

 

사실 파이썬의 장점은 sorted 외에 하나도 들어가 있지 않다.

 

다른 풀이들을 보겠다.


다른 풀이

 

import re
from collections import Counter

def solution(s):

    s = Counter(re.findall('\d+', s))
    return list(map(int, [k for k, v in sorted(s.items(), key=lambda x: x[1], reverse=True)]))

어떻게 이런 생각을 할 수 있는지... 정말 고수는 많다.

설명을 하자면 정규표현식으로 모든 숫자를 찾아서 count 한다.

 

"{{2}, {2,1}, {2,1,3}, {2,1,3,4}}"

이 경우에는 counter(2:4, 1:3, 3:2, 4:1) 이 된다.

이것을 가장 많이 나온 순서대로 추가하면 [2,1,3,4]가 나오므로 끝이다.

 

내 코드보다 거의 4배 이상 빠른 코드다.

 


내 코드에서 파싱을 보완한 코드도 보겠다.

 

def solution(s):
    answer = []

    s1 = s.lstrip('{').rstrip('}').split('},{')
    print(s1)

    new_s = []
    for i in s1:
        new_s.append(i.split(','))

    new_s.sort(key = len)

    for i in new_s:
        for j in range(len(i)):
            if int(i[j]) not in answer:
                answer.append(int(i[j]))

    return answer

strip과 split을 적절하게 사용해서 숫자 부분만 가져온 코드다.

다른 패키지를 사용하지 않았으므로

이 정도로 생각해서 푸는 방식이 정석일 것 같다.

반응형

댓글