튜플 문서의 문제 1 풀이 코드다. if __name__ == "__main__": 아래가 자체 테스트다.

"""튜플 (프로그래머스 64065) 풀이와 검증."""
import random
import re
from collections import Counter


def solution(s):
    groups = s[2:-2].split("},{")
    groups = sorted((list(map(int, g.split(","))) for g in groups), key=len)
    answer, seen = [], set()
    for g in groups:
        for x in g:
            if x not in seen:
                seen.add(x)
                answer.append(x)
    return answer


def solution_count(s):
    count = Counter(re.findall(r"\d+", s))
    return [int(x) for x, _ in count.most_common()]


def encode(tup, rng):
    """튜플을 문제 규칙대로(바깥·안쪽 순서를 섞어) 문자열로 만든다."""
    groups = []
    for k in range(1, len(tup) + 1):
        g = tup[:k]
        rng.shuffle(g)
        groups.append("{" + ",".join(map(str, g)) + "}")
    rng.shuffle(groups)
    return "{" + ",".join(groups) + "}"


if __name__ == "__main__":
    ex = [("{{2},{2,1},{2,1,3},{2,1,3,4}}", [2, 1, 3, 4]), ("{{1,2,3},{2,1},{1,2,4,3},{2}}", [2, 1, 3, 4]),
          ("{{20,111},{111}}", [111, 20]), ("{{123}}", [123]), ("{{4,2,3},{3},{2,3,4,1},{2,3}}", [3, 2, 4, 1]),
          ("{{2,1},{2},{2,1,3}}", [2, 1, 3])]
    for s, want in ex:
        assert solution(s) == want == solution_count(s), s
    rng = random.Random(64065)
    for _ in range(2000):
        n = rng.randint(1, 30)
        tup = rng.sample(range(1, 100001), n)
        s = encode(tup[:], rng)
        assert solution(s) == tup == solution_count(s)
    print("ALL CHECKS PASSED")