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
\d
숫자를 한 글자만 찾음+
하나 혹은 그 이상 연결된\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를 출력
앞에 올 숫자가 빈도가 높을 수 밖에 없기 때문