def solution(s):
srcs = s[2:-2].split('},{') # 양쪽 끝 {{ }} 삭제 -> 중간중간에 있는 },{를 기준으로 쪼갬
srcs = list(map(lambda x:list(map(int, x.split(","))), srcs))
srcs.sort(key=lambda x:len(x))
answer = srcs[0]
for i in srcs[1:] :
for j in answer :
i.remove(j)
answer.append(i[0])
return answer
문제정리
n개의 요소를 가진 튜플을 n-튜플(n-tuple)이라고 하며, 다음과 같이 표현할 수 있습니다.
예를 들어 튜플이 (2, 1, 3, 4)인 경우 이는 → {{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}
풀이과정
처음에 어렵게 생각한것은 s = {{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}이 문자열이여서 어떻게 파싱해야할지 고민이였다.
다른사람 풀이를 보았는데 양쪽끝 {{}}을 뺀다음 split()을 “},{”기준으로 쪼개개서 “1,2,3,4”로 만든다음 그것을 배열로 만들었다. 좀 고민했는데 신박한 방법인거같아 해당 방법으로 파싱하였다.
핵심으로 판단한 것은 각 부분집합들이 점점 커질때마다 추가되는 수를 확인하면 된다는 것이였다.
즉 {2} → {2,1} 일 경우 새로 추가된 1이 튜플에 다음 수라는 것이다.
s의 길이가 s의 길이는 5 이상 1,000,000 이하여서 일일히 원소를 하나하나 비교하기에는 시간초과에 걸릴거같다는 생각이들었다.
하지만 전체를 돌지는 않을거같다는 생각이들어서 한번 일일히 원소를 확인하는 로직으로 확인해 봤는데 통과하여서 살짝놀랐다.
풀이 후
처음부터 파싱할때 부터 다른사람코드를 보긴하였지만 다른 풀이를 보니 더욱 놀랐다.
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
해당 코드는 원소의 갯수가 가장 많은 순서대로 리스트에 담았다.
나의 풀이의 “각 부분집합들이 점점 커질때마다 추가되는 수를 확인”를 정확히 관통하는 풀이라고 생각이들었따 → 추가되는 수는 항상 다음에도 동일하게 추가되기 때문에 원소의 갯수로 나열한다음 순서대로 더하면 \
해당 풀이가 가장 깔끔하고 획기전인거 같다.