본문 바로가기

개발/Algorithm

[프로그래머스] 튜플(python)

Programmers, 튜플

2019년 카카오 개발자 겨울 인턴십

TL;DR

  • 문자열(string)

문제 요약

1. 특정 튜플을 표현하는 집합이 담긴 문자열 s에 대해서 s가 표현하는 튜플을 배열에 담아 반환하는 함수 작성

 

- 중복된 원소가 없고 순서가 정해져있는 튜플에 대해서 튜플의 원소로 만들 수 있는 부분 집합들이 문자열의 형태로 주어진다.

- 주어진 문자열들을 사용하여 본래 튜플을 찾아 반환하는 함수를 작성하면 된다.

- 문제의 예시를 살펴보면 문제 해결 방법을 알아낼 수 있다.

입출력 형태

입출력 예시

 

문제에서 설명한 것과 같이 튜플은 원소의 순서 또한 일치해야 동일한 튜플이라고 할 수 있다.

예시 1 :: 주어진 문자열이 {2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}를 나타내고 있고 정답 튜플은 [2, 1, 3, 4]이다.

예시 2 :: 주어진 문자열이 {1, 2, 3}, {2, 1}, {1, 2, 4, 3}, {2}를 나타내고 있고 정답 튜플은 예시 1과 동일한 [2, 1, 3, 4]이다.

- 예시 2의 문자열을 길이로 정렬하면 {2}, {2, 1}, {1, 2, 3}, {1, 2, 4, 3}가 된다. 이 때, 길이가 짧은 문자열에 담긴 원소부터 튜플에 담게 되면 가장 처음에는 2가 튜플에 들어오고 두 번째인 {2, 1}에서는 2가 이미 튜플에 존재함으로 1이 튜플에 들어오게 된다. 세 번째인 {1, 2, 3}에서는 튜플에 존재하는 2와 1을 제외한 3이 튜플에 속하게 되고, 마지막인 {1, 2, 4, 3}에서는 튜플에 존재하지 않는 4가 튜플에 들어오게 된다.

- 이를 통해 주어진 문자열을 파싱하여 길이 순으로 정렬한 후, 순서대로 튜플에 원소가 유일하도록 삽입하면 우리가 원하는 튜플을 구할 수 있음을 확인할 수 있다.

풀이

def solution(s):
    answer = []
    # 1. 튜플의 원소를 파싱
    s = s[2:-2].split('},{')
    # 2. 파싱된 튜플의 원소들을 길이 별로 정렬
    s.sort(key=lambda x: len(x))
    # 3. 순서대로 튜플에 존재하는지 확인 후 튜플에 삽입
    for c in s:
        for _c in c.split(','):
            if int(_c) not in answer:
                answer.append(int(_c))
    return answer

 

1. 주어진 값이 문자열이기 때문에 원하는 방식으로 파싱을 진행해야 한다. 문자열의 가장 앞과 뒤에 위치한 '{{}}' 기호를 제거하기 위해 슬라이싱을 통해서 제거한 후 각 원소들을 '},{'로 나눈다. 이 과정을 진행할 경우 그림과 같이 각 원소들만 남는 리스트를 얻을 수 있다.

파싱한 결과를 출력에서 확인할 수 있다.

 

이렇게 슬라이싱과 split 함수를 적절히 사용하여 원소로 주어진 튜플들의 값만 얻어낼 수 있다.

 

2. 다음 과정은 길이 별로 정렬하는 것이다. sort를 진행할 때 key가 각 원소의 길이인 len(x)로 지정하게 되면 길이 순으로 정렬된 값을 얻을 수 있다.

 

3. 이제는 길이 별로 정렬된 원소에서 하나씩 정답 리스트에 담으면 된다. 각 배열의 원소들은 ','로 구분된 문자열로 나눌 수 있다. split(',')를 통해 숫자들만 조회하여 정답 리스트에 존재하지 않는다면 삽입하고 만약 존재한다면 아무런 것도 하지 않는다. 이를 통해 정답 리스트를 얻어낼 수 있다.

반응형