반응형
프로그래머스 튜플을 파이썬으로 풀어보겠다.
이번 문제의 난이도는 레벨 2고 2019년 카카오 문제다.
문제
문자열을 파싱 해서 제일 큰 리스트를 반환하면 되는데
여기서 집합의 원소 순서가 바뀔 수 있기에 한 번 더 생각을 해야 하는 문제다.
구현
문제를 차례차례 해결해 나가는 방식으로
문자열 파싱을 한 후
리스트의 크기로 정렬하고
작은 리스트부터 검사해서 결과에 추가를 했다.
코드
def solution(s):
answer = []
num=''
flag=0
for c in s[1:-1]:
if c=='{':
num=''
temp=[]
flag=1
elif c==',' and flag:
temp.append(int(num))
num=''
elif c=='}':
temp.append(int(num))
answer.append(temp)
flag=0
else:
num+=c
answer = sorted(answer, key=lambda x: len(x))
result = []
for a in answer:
for n in a:
if n not in result:
result.append(n)
return result
구현과 같이 정직하게 풀었다.
사실 파이썬의 장점은 sorted 외에 하나도 들어가 있지 않다.
다른 풀이들을 보겠다.
다른 풀이
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)]))
어떻게 이런 생각을 할 수 있는지... 정말 고수는 많다.
설명을 하자면 정규표현식으로 모든 숫자를 찾아서 count 한다.
"{{2}, {2,1}, {2,1,3}, {2,1,3,4}}"
이 경우에는 counter(2:4, 1:3, 3:2, 4:1) 이 된다.
이것을 가장 많이 나온 순서대로 추가하면 [2,1,3,4]가 나오므로 끝이다.
내 코드보다 거의 4배 이상 빠른 코드다.
내 코드에서 파싱을 보완한 코드도 보겠다.
def solution(s):
answer = []
s1 = s.lstrip('{').rstrip('}').split('},{')
print(s1)
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
strip과 split을 적절하게 사용해서 숫자 부분만 가져온 코드다.
다른 패키지를 사용하지 않았으므로
이 정도로 생각해서 푸는 방식이 정석일 것 같다.
반응형
'Coding Test > Python' 카테고리의 다른 글
[프로그래머스] 괄호 변환 Python Code (0) | 2022.09.04 |
---|---|
[프로그래머스] 메뉴 리뉴얼 Python Code (0) | 2022.09.01 |
[프로그래머스] 행렬 테두리 회전하기 Python Code (2) | 2022.09.01 |
[프로그래머스] 짝지어 제거하기 Python Code (0) | 2022.08.31 |
[프로그래머스] 타겟 넘버 Python Code (0) | 2022.08.30 |
댓글