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