[Python] 프로그래머스 - Level2 - 튜플

강주형·2022년 8월 25일
0

https://school.programmers.co.kr/learn/courses/30/lessons/64065

2019 카카오 개발자 겨울 인턴십

def solution(s):
    answer = []
    temp = []
    s_list = []
    str_temp = ''
    for i in s[1:-1]:
        if i == '{' :
            continue
        elif i.isdigit():
            str_temp += i
        elif i == ',' and str_temp:
            temp.append(int(str_temp))
            str_temp = ''
        elif i == '}':
            if str_temp:
                temp.append(int(str_temp))
                str_temp = ''
            s_list.append(temp)
            temp = []
            
    s_sort = sorted(s_list, key = lambda x : len(x))
    for ss in s_sort:
        for s in ss:
            if s not in answer:
                answer.append(s)
    return answer

반복문을 돌면서 들어오는 경우의 수를 하나하나 따져서 조건문을 만들었다.
딱봐도 비효율적인 것 같아서 풀고 타인 코드를 확인함


타인 코드

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)]))

import re
from collections import Counter
  1. \d 숫자를 한 글자만 찾음
  2. + 하나 혹은 그 이상 연결된
  3. \d+하나 혹은 그 이상 연결된 숫자

따라서, 받아온 s를 각 숫자마다 Counter 객체로 빈도를 저장함

예를 들어

s = "{{20,111},{111}}"

일 때,

Counter({'111': 2, '20': 1})

이런식으로 객체가 생성 됨


예시 하나 더 들어보자

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

일 때,

Counter({'3': 4, '2': 3, '4': 2, '1': 1})

마지막 return에서 빈도를 기준으로 내림차순으로 정렬한 list를 출력
앞에 올 숫자가 빈도가 높을 수 밖에 없기 때문

profile
Statistics & Data Science

0개의 댓글