프로그래머스 64065번 : 튜플 [Python]

kimminjunnn·2026년 2월 9일

알고리즘

목록 보기
305/322
post-thumbnail


문제 파악

문제 글만 읽고서는 문제를 이해하기가 다소 난해했다.

한마디로 's'를 입력받고,
ex) "{{4,2,3},{3},{2,3,4,1},{2,3}}"
여기에 원소 4개가 반복적으로 쓰이는데 이 순서를 파악해서 [3,2,4,1] 리스트 형식으로 반환해야 한다.

순서는
"{{4,2,3},{3},{2,3,4,1},{2,3}}" 에서 원소개수가 제일 작은 집합부터 봤을 때

  • {3} → 첫 원소는 3
  • {2,3} → 여기서 새로 추가된 값은 2 → 다음 원소는 2
  • {4,2,3} → 새로 추가된 값은 4 → 다음 원소는 4
  • {2,3,4,1} → 새로 추가된 값은 1 → 마지막 원소는 1

따라서 결과는 [3,2,4,1] 이 된다.

해결 아이디어

문자열을 잘 조작하여 필요한 값들만 다뤄서 내가 원하는 자료구조에 넣고,
원소 개수 순으로 정렬시킨 후 차례로 등장하는 원소들을 answer 배열에 넣어주었다.

  • is_in : 현재 { } 안을 읽고 있는지 확인하는 플래그
  • temp : { } 한 덩어리(집합) 안의 숫자들을 담는 임시 리스트
  • num : "2" "3" "," 처럼 들어오는 숫자 문자를 누적해서 "23"으로 만든 뒤 int(23)으로 변환하기 위한 임시 문자열

내 해답 코드

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

def solution(s):
    
    # 껍데기 벗기기
    s = s[1:-1] # {4,2,3},{3},{2,3,4,1},{2,3}
    
    arr = []
    temp = []
    is_in = False
    num = "" # 숫자 누적용
    
    for c in s:
        if c == "{":
            is_in = True
            temp = [] # temp 비우기
            num = "" # num 비우기
            
        elif c == "}":
            if num != "":
                temp.append(int(num))
                num = ""
                
            arr.append((temp)) # 괄호 닫기 전 temp 값들 튜플로 감싸서 arr에 넣기
            is_in = False
            
        elif is_in:
            if c.isdigit():
                num += c # num에 숫자 누적
            elif c ==",":
                if num !="":
                    temp.append(int(num))
                    num =""
                    
    
    # arr = [[4,2,3],[3],[2,3,4,1],[2,3]]
    arr = sorted(arr, key=len)
    
    answer = []
    
    # answer에 값들을 넣을건데 없는 것만 넣기
    for nums in arr:
        for n in nums:
            if n not in answer:
                answer.append(n)
    
    return answer

더 좋은 방법 (set 활용)

위 코드는 if n not in answer: 처럼 리스트에서 포함 여부를 확인하는 방식이라,
원소가 많아지면 매번 선형 탐색이 들어가서 효율이 떨어질 수 있다.

seen이라는 set을 같이 써서 “이미 넣은 값인지”를 빠르게 체크하면 더 정석이다.

    answer = []
    seen = set()
    
    for nums in arr:
        for n in nums:
            if n not in seen:
                answer.append(n)
                seen.add(n)
    
    return answer

다시 풀어본 코드

# s = "{{2},{2,1},{2,1,3},{2,1,3,4}}"
def solution(s):
    # {} 떼고 [(2),(2,1),(2,1,3),(2,1,3,4)] 만들기
    
    s = s[2:-2] # 2},{2,1},{2,1,3},{2,1,3,4
    
    s = s.split("},{") # ["2","2,1","2,1,3","2,1,3,4"]
    
    arr = []
    for c in s:
        arr.append(list(map(int,c.split(","))))
    
    # arr = [[2],[2,1],[2,1,3],[2,1,3,4]]
    
    # len 에 대한 정렬
    arr = sorted(arr,key=len)
    
    result = []
    seen = set()
    
    for nums in arr:
        for num in nums:
            if num not in seen:
                result.append(num)
                seen.add(num)

    return result
profile
Frontend Engineers

0개의 댓글