프로그래머스Lv2 튜플(python)
Sep 26, 2020
»
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
정규식을 이용한 풀이이다.