CS/algorithm & data structure

[프로그래머스] 튜플 (파이썬 풀이)

hjkim0502 2022. 6. 27. 00:42

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

 

내 풀이:

def solution(s):
    stack = []
    result, ans = [], []

    for char in s[1:-1]:
        if char == '{':
            stack.append(char)
        elif char.isdigit():
            stack[-1] += char
        elif char == ',':
            stack[-1] += char
        elif char == '}':
            result.append(set(stack[-1][1:].split(',')))

    prev = set()
    for l in sorted(result, key = len):
        ans.append(int(list(l - prev)[0]))
        prev = l

    return ans

제출 후 최적화한 풀이:

def solution(s):
    str, temp, ans = '', [], []
    
    for char in s.replace('},', '}'):
        if char.isdigit() or char == ',':
            str += char
        elif char == '}':
            temp.append(set(str.split(',')))
            str = ''
    
    prev = set()
    for l in sorted(temp[:-1], key = len):
        ans.append(int(list(l - prev)[0]))
        prev = l
        
    return ans
  • 아이디어: 주어진 문자열을 동일 구성으로 리스트 안에 집합 구조로 만들고, 해당 리스트를 정렬하여 for문 돌면서 직전 집합과의 차집합을 통해 나온 원소를 정답 리스트에 입력

 

참고 풀이1:

import re
from collections import Counter

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)]))
  • 아이디어: 숫자들을 모두 세어 가장 갯수가 많은 순서대로 정답 리스트에 입력
  • 정규식을 이용하고, 갯수가 많은 순으로 배치한다는 아이디어 덕분에 코드가 매우 깔끔함

 

참고 풀이2:

def solution(s):
    s = s.lstrip('{').rstrip('}').split('},{')
    
    answer, temp = [], []
    for i in s:
        temp.append(i.split(','))

    for i in sorted(temp, key = len):
        for j in range(len(i)):
            if int(i[j]) not in answer:
                answer.append(int(i[j]))

    return answer
    
    ###############################################
def solution(s):
    s = s.lstrip('{').rstrip('}').split('},{')

    answer, temp = [], []
    for i in s:
        temp.append(set(i.split(',')))

    prev = set()
    for l in sorted(temp, key = len):
        answer.append(int(list(l - prev)[0]))
        prev = l

    return answer
  • 정규식 없이 파싱을 훨씬 깔끔하게 한 풀이
  • 밑에 정답 리스트에 원소 입력하는 과정은 매우 느려 내가 처리한 방식대로 변경하니 훨씬 빨랐음