본문 바로가기

개발 일기/알고리즘 문제 풀이

[2019 카카오 겨울 인턴십] 튜플

문제 : https://programmers.co.kr/learn/courses/30/lessons/64065

Github Link : https://github.com/yuseon27/Algorithm_Practice/blob/master/Kakao/2019_winter_internship/02.%20tuple.py

 

더보기

[문제 설명]

튜플을 표현하는 집합이 담김 문자열이 주어졌을 때, 문자열이 표현하는 튜플을 리턴하시오.

셀 수 있는 수량의 순서가 있는 열거 또는 어떤 순서를 따르는 요소들의 모음을 튜플(Tuple)이라고 합니다.

원소의 개수가 n개이고, 중복되는 원소가 없는 튜플 (a1, a2, a3, ..., an)이 주어질 때(단, a1, a2, ..., an은 자연수), 이는 다음과 같이 집합 기호 '{', '}'를 이용해 표현할 수 있습니다.

  • {{a1}, {a1, a2}, {a1, a2, a3}, {a1, a2, a3, a4}, ... {a1, a2, a3, a4, ..., an}}

 

[입력 예제]   "{{1,2,3},{2,1},{1,2,4,3},{2}}"

[결과]   [2, 1, 3, 4]

[제한사항]

  • s의 길이는 5 이상 1,000,000 이하입니다.
  • s는 숫자와 '{', '}', ',' 로만 이루어져 있습니다.
  • 숫자가 0으로 시작하는 경우는 없습니다.
  • s는 항상 중복되는 원소가 없는 튜플을 올바르게 표현하고 있습니다.
  • s가 표현하는 튜플의 원소는 1 이상 100,000 이하인 자연수입니다.
  • return 하는 배열의 길이가 1 이상 500 이하인 경우만 입력으로 주어집니다.

 

[문제 해결]

코드를 아주 짧게 작성하는 방법도 있지만, 정석적인 방법으로 문제를 해결했습니다.

1. 이 문제는 먼저 입력 받은 문자열을 리스트의 형태로 변환을 시킨다. (리스트의 리스트 형태)

2. 리스트를 길이 순으로 정렬한다.

3. 정렬된 리스트를 돌면서 또, 그 안의 리스트를 돌면서 값 한개 씩 보면서 answer에 없으면 해당 값을 answer에 추가한다.

 

참고 포인트 1.

여기서, 문자열을 리스트로 변환하기 위해 ast를 import하여 ast.literal_eval(str)을 사용했다.

위 함수는 string이 리스트의 형태로 주어졌을 때, string을 list로 바꿔주는 라이브러리이다.

 

참고 포인트 2.

리스트의 리스트을 정렬하고자 할 때, sorted()와 .sort() 두 가지가 있는데 sorted()를 사용했다.

그리고 길이에 따라 정렬하기 위해 key를 사용했다. sorted(llist, key=len)과 같이 key=len을 사용하면 리스트를 그 안의 list의 길이를 기준으로 정렬할 수 있다.

리스트의 정렬에 대해 더 알고싶으면 아래 링크를 확인하세요.

2021.04.18 - [개발 일기/Python] - [Python] 리스트 정렬하기

 

[Python] 리스트 정렬하기

리스트를 정렬하는 함수는 .sort()와 sorted() 2가지가 있다. 저는 주로 sorted()를 사용해요. 리스트 뿐만 아니라 String(문자열)도 정렬 가능합니다! .sort() 원본을 직접 정렬하므로 None을 리턴함 ex) llist.

white-bear.tistory.com

 

 

[코드]

import ast
def solution(s):
    answer = []
    
    # 문자열을 리스트로 변환 (Make string input as list)
    strs = ast.literal_eval(s.replace('{', '[').replace('}', ']'))
    strs = sorted(strs, key=len)  # Sort list by length
    
    # 길이가 짧은 것부터 보면서 answer에 없는 값 추가하기
    for ss in strs : #{
        for t in ss : #{
            if t not in answer : 
                answer.append(t)
        #}    
    #}
    
    return answer