catbook 종원's 블로그 이사 온 블로그

프로그래머스Lv2 튜플(python)

» Algorithm

문제

다음과 같은 튜플이 존재한다.

T = (a1, a2, a3, …, an)

튜플 T를

’{{a1}, {a1, a2}, {a1, a2, a3}, {a1, a2, a3, a4}, … {a1, a2, a3, a4, …, an}}’

의 형태로 표현한 집합이 주어졌을때,

원래의 튜플 T를 return 하는게 문제이다.
ex)

input: '{{1, 2, 3}, {2}, {2, 1}, {2, 1, 3, 4}}'   

output: [2, 1, 3, 4]




접근법

가장 먼저 눈에 들어온 것은 입력이 string형태고 출력은 list라는 것이다.
따라서 먼저 string을 2중리스트로 변환해야겠다는 생각을 하였다.
문자열 파싱을 잘 활용할 줄 아는가 묻는 문제인것 같다.
주어진 집합이 다음과 같다고 하자.

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

일 때 양 옆 중괄호쌍을 제거한다.

'1, 2, 3}, {2}, {2, 1}, {2, 1, 3, 4'

'}.{' 를 기준으로 원소를 나누어 리스트로 만든다.

['1, 2, 3', '2', '2, 1', '2, 1, 3, 4']

각 원소의 길이가 짧은 순으로 sort를 한다.
lambda를 이용하면 각 원소의 특징으로 sorting하는것이 매우 간단하다.
아직 lambda를 활용하는 것이 어색하다.

['2',  '2, 1', '1, 2, 3', '2, 1, 3, 4']

answer 이름의 빈 리스트를 생성 후 첫 번째 원소부터 순회하여 answer에 값이 없으면 추가해준다.




code

def solution(s):
    answer = []
    s = s[2:-2].split('},{')
    print(s)
    s_list = sorted(s, key = lambda i: len(i))
    print(s_list)
    for i in s_list:
        for j in list(map(int, i.split(','))):
            if j not in answer:
                answer.append(j)
    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

정규식을 이용한 풀이이다.