개발자 노트

[프로그래머스-2019겨울카카오인턴]튜플 본문

알고리즘 문제 풀이

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

jurogrammer 2020. 3. 31. 15:20

문제설명

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

카카오답게 문자열 처리하는 문제

예전에 처음 풀었을 땐 문제를 도저히 이해하지 못해서 넘어갔으나... 그 이유는

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

이렇게 열겨형 정의를 넘어갔기 때문인 것 같다. 이 부분을 잘 보면 튜플의 원소를 하나씩 추가하여 집합으로 표현할 수 있다는 뜻.

접근

위처럼 열거형 정의를 잘 보면 이렇게 생각할 수 있다.

  1. (1,2,3)이 주어지면 {1},{1,2},{1,2,3}으로 표현할 수 있다.
    • 즉, 왼쪽부터 길이가 증가하는 순서대로 집합으로 표현된다.
  2. 그 집합은 순서가 제멋대로이다.
    • {1},{2,1},{3,1,2} 로 주어질 수 있다.
  3. (2,3,1)이라면
    • {2}, {3,2},{2,3,1}로 주어질 수 있음

이렇게 문제를 이해했다면 접근 방법은 50% 짰다고 볼 수 있다. 결국엔 집합의 갯수가 작은 것부터 나열한 뒤 추가되는 수를 차례로 넣어주면 그게 바로 구하려는 튜플.

여기서 부터는 절차는 사람마다 다양할 것 같다.

난 효율성을 전혀 고려하지 않고 python의 장점을 백분이용해서 풀었다.

구현

def parsing(s): #return은 정렬된 값
    # parsing작업
    s = s[2:-2]
    s = s.split("},{")
    parsingList = list(s)  # return 형태  ['2,1,3,4', '2', '2,1', '2,1,3']
    n = len(parsingList)
    sortedSets = []
    for i in range(n):
        sortedSets.append(set(parsingList[i].split(',')))

    return sorted(sortedSets)



def solution(s):
    answer = []

    sortedSets = parsing(s)
    n = len(sortedSets)
    item = sortedSets[0].copy()
    answer.append(int(item.pop()))
    for i in range(1,n):
        item = sortedSets[i]-sortedSets[i-1]
        answer.append(int(item.pop()))

    return answer


s = "{{2},{2,1},{2,1,3},{2,1,3,4}}"
print(solution(s))
반응형
Comments