프로그래머스 - 튜플 [2019 카카오 개발자 겨울 인턴십]

2026. 1. 21. 08:42·코테

문제 설명:

셀 수 있는 수량의 순서 있는 열거 또는 어떤 순서를 따르는 요소들의 모음을 튜플(tuple)이라고 합니다. n개의 요소를 가진 튜플을 n-튜플(n-tuple)이라고 하며, 다음과 같이 표현할 수 있습니다.

(a1, a2, a3, ..., an)
튜플은 다음과 같은 성질을 가지고 있습니다.

중복된 원소가 있을 수 있습니다. ex : (2, 3, 1, 2)
원소에 정해진 순서가 있으며, 원소의 순서가 다르면 서로 다른 튜플입니다. ex : (1, 2, 3) ≠ (1, 3, 2)
튜플의 원소 개수는 유한합니다.
원소의 개수가 n개이고, 중복되는 원소가 없는 튜플 (a1, a2, a3,..., an)이 주어질 때(단, a1, a2,..., an은 자연수), 이는 다음과 같이 집합 기호 '{', '}'를 이용해 표현할 수 있습니다.

{{a1}, {a1, a2}, {a1, a2, a3}, {a1, a2, a3, a4}, ... {a1, a2, a3, a4,..., an}}
예를 들어 튜플이 (2, 1, 3, 4)인 경우 이는

{{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}
와 같이 표현할 수 있습니다. 이때, 집합은 원소의 순서가 바뀌어도 상관없으므로

{{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}
{{2, 1, 3, 4}, {2}, {2, 1, 3}, {2, 1}}
{{1, 2, 3}, {2, 1}, {1, 2, 4, 3}, {2}}
는 모두 같은 튜플 (2, 1, 3, 4)를 나타냅니다.

특정 튜플을 표현하는 집합이 담긴 문자열 s가 매개변수로 주어질 때, s가 표현하는 튜플을 배열에 담아 return 하도록 solution 함수를 완성해 주세요.


문제 예시:

s result
"{{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]

문제 해결:

import re

def solution(s):
    answer = []
    
    s = re.split('[^0-9$]', s)
    
    dct = dict()
    temp = list()
    for c in s:
        if c:
            temp.append(c)
        elif temp:
            dct[len(temp)] = temp
            temp = list()
            
    for idx in range(1, max(dct.keys())+1):
        for c in dct[idx]:
            if int(c) not in answer:
                answer.append(int(c))
    
    return answer

한 번 시도에 이 정도 코드 길이로 나왔는데 생각보다 길게 뽑혔다. 문제 해결 시 고민해야 하는 포인트가 몇 개 있다.

1. 튜플을 구성할 때 짧은 길이의 subset이 가장 먼저 나오는 index로 설정해야 하고 

2. 들어오는 s가 String이므로 split을 잘해야 한다.

 

2번의 경우 regular expression을 평소에 익힌 독자들이라면 쉽게 풀었을 것으로 사료된다.

필자의 경우 그렇지 못해서 for문을 한 번 더 돌리면서 정제하는 모습을 볼 수 있다.

 

이후에 이중 for문을 돌리며 answer에 값을 넣었는데 dict 구조에 key값으로 length를 넣어서 쉽게 찾을 수 있게 해 놨다.

다른 풀이를 봐보자


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

다음 코드의 경우 가져갈만한 포인트는 두 개 정도이다

1. Counter 객체를 통한 char의 개수 dict 만들기

2. sorted에서 key를 사용하여 비교 인자를 바꾸기

 

첫 번째로 Counter 객체를 사용하면 어떤 숫자가 몇 번 나온 지 볼 수 있다.

{"2": 4,... } 이런 예시로 나온다.

생각의 전환을 통해 튜플을 만들 때 먼저 나와야 하는 index의 경우 여러 subset에 포함되어 있을 테니 가장 많이 나올 것이다.

이런 관점에서 Counter를 사용해 각 Char들을 넣으면 value를 통해 가장 높은 value부터 뽑으면 정답이 되는 것이다.

 

두 번째로 sorted에서 key=lambda x: x [1], reverse=True 이렇게 두 인자가 있는데 key는 lambda x: x [1]을 통해 s.items()에서 1 번째 index를 보겠다는 뜻인데 이는 dict.items()를 이해해야 한다

 

for k, v in dict.items(): 이런 식으로 보통 많이 사용하는데 이때 dict.items()를 하면 (key, value)의 set이 나오게 된다. 이걸 unzip 하여 for문에서 뿌리는 것으로 x [1]은 value를 보겠다는 뜻이다.

 

마지막으로 map을 통해 String인 데이터를 int로 바꾸면서 list 화하면 바로 answer가 나오게 된다.

'코테' 카테고리의 다른 글

프로그래머스 - 행렬의 곱셈 [연습문제]  (0) 2026.01.25
프로그래머스 - 의상 [해시]  (1) 2026.01.25
프로그래머스 - 기능개발 [스택/큐]  (0) 2026.01.20
프로그래머스 - 스킬트리 [Summer/Winter Coding(~2018)]  (0) 2026.01.19
프로그래머스 - 올바른 괄호 [스택/큐]  (1) 2026.01.19
'코테' 카테고리의 다른 글
  • 프로그래머스 - 행렬의 곱셈 [연습문제]
  • 프로그래머스 - 의상 [해시]
  • 프로그래머스 - 기능개발 [스택/큐]
  • 프로그래머스 - 스킬트리 [Summer/Winter Coding(~2018)]
junsky00
junsky00
대기만성?
  • junsky00
    편안한 마음으로 꽃 구경하기
    junsky00
  • 전체
    오늘
    어제
    • 분류 전체보기 (26)
      • 코테 (21)
      • IT 뉴스 (4)
      • SKALA (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    LLM 잘 쓰기
    코테
    동적 프로그래밍
    파이썬
    DP
    큐
    코딩 테스트
    프로그래머스
    BFS
    SK AX
    Google Paper
    AI agent
    PAPER
    탐색
    구현
    카카오
    AI
    Python
    보고서 생성
    스택
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
junsky00
프로그래머스 - 튜플 [2019 카카오 개발자 겨울 인턴십]
상단으로

티스토리툴바