본문 바로가기

알고리즘 삽질장

[프로그래머스] 튜플

반응형


문제설명

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

 

코딩테스트 연습 - 튜플

"{{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] "{{4,2,3},{3},{2,3,4,1},{2,3}}" [3, 2, 4, 1]

programmers.co.kr

사고과정

  • 문자열 형태로 주어지는 것을 보니 스택을 활용해야 하는 듯한 문제 느낌이 팍! 왔다. 크게 보면 스택 유형의 문제인 듯 하다.
  • 문제에서 주의해야 할 점은 튜플의 부분집합 결과가 주어졌을 때, 이를 튜플로 변환해야 하는데 튜플의 원소 순서가 다르면 다른 것으로 간주한다는 점이다. 이를 어떻게 활용해 풀 수 있을까 하다가 아이디어가 떠올랐다.
  • 아이디어는 주어진 입출력 예시 1,2번에서 얻을 수 있었다. 잘 보면 각 집합 길이가 늘어나면서 추가되는 원소순서대로 result에다가 담으면 우리가 원하는 튜플로 변환할 수 있다는 것을 알 수 있다.
  • 그래서 우선 주어진 문자열의 가장 바깥 { } 을 제외한 후 for loop를 돌면서 한 집합 {} 안에 들어가는 원소들을 모두 스택에 넣어주면서 한 집합 {}이 끝나면 리스트안에다가 해당 원소들을 모두 넣어준다. 그리고 집합 길이 기준으로 오름차순으로 정렬한 후, 1번째 집합, 2번째 집합의 차집합을 이용, 2번째 집합, 3번째 집합 차집합을 이용, ... 이런식으로 해서 집합 길이가 늘어날 때마다 추가되는 원소 1개를 순서대로 뽑아주었다. 단, 튜플의 첫번째 원소는 원소 길이가 1인 집합의 원소를 넣고 시작하면 된다.
  • 그리고 한가지 또 주의할 점은 문자열이 주어지기 때문에 문자열에서 100을 1,0,0으로 인식한다. 그래서 이것을 1,0,0이 아닌 100 원소 하나로 넣어주기 위해서는 숫자가 나올때는 num이라는 빈문자열에 계속 추가해주다가 콤마(,) 또는 } 문자열이 등장할 때 그동안 추가했던 문자열 num을 스택에 넣어준다! 
  • 그동안 풀어봤던 문제 풀이에서 경험치가 쌓인 것으로 풀 수 있었다!
  • 다른 사람 풀이를 보았는데, 별 다른 라이브러리를 사용하지 않고 매우 간결하게 푸신 분의 풀이도 매우 인상적이었다!

풀이

def solution(s):
    answer = []
    s = s[1:-1]
    stack = []  # 스택에는 숫자만 넣기
    num = ''
    for x in s:
        if x.isdigit():
            num += x
        elif x == '{':
            continue
        elif x == ',':
            if num:
                stack.append(int(num))
                num = ''
        else: # '}'일 경우
            if num:
                stack.append(int(num))
                num = ''
            answer.append(set(stack))
            stack.clear()
            
    answer = sorted(answer, key=len)
    result = [list(answer[0])[0]]
    if len(answer) == 1:
        return result
    else:
        for i in range(len(answer)-1):
            val = list(answer[i+1] - answer[i])[0]
            result.append(val)
        return result

- 다른 사람의 풀이

def solution(s):
    answer = []

    s1 = s.lstrip('{').rstrip('}').split('},{')

    new_s = []
    for i in s1:
        new_s.append(i.split(','))

    new_s.sort(key = len)

    for i in new_s:
        for j in range(len(i)):
            if int(i[j]) not in answer:
                answer.append(int(i[j]))

    return answer
반응형