문제 이해 시간 : 19분;; (이렇게 오래 걸린적은 처음이었다;;)
풀이 시간 : 45분;
결과 : 못품
틀린 풀이(중도 포기)
def solution(s):
stack = []
for i in range(len(s)):
if s[i] == '{':
tmp = []
tmp_s = ''
elif s[i].isdigit():
tmp_s += s[i]
elif s[i] == '}':
stack.append(tmp)
elif s[i] == ','and s[i-1] != '}':
tmp.append(int(tmp_s))
stack.pop()
stack.sort(key=len)
answer = []
print(stack)
for i in range(len(stack)):
answer.append(stack[i][-1])
return answer
생각한 과정
일단 문제 이해가 정말정말 중요했다.
튜플이 주어지는데, 튜플은 중복이 가능하다. 이를 집합으로 표현할 수 있다. 근데, 집합은 순서가 바뀌어도 상관이 없다. 처음 어려웠던 부분은 집합이 주어지는데 어떻게 결과에는 순서가 있지?? 였다. 그래서 이 부분을 이해하려고 여러번 보느라 시간이 오래 소요됐다.
예시를 한번 보자 "{{2},{2,1},{2,1,3},{2,1,3,4}}" 2가 있는 하나의 집합이 있다. 한개짜리 집합에 있는 것들이 결과에 처음 왔다..
그리고 두개짜리의 두번째, 세개짜리의 세번째, 네개짜리의 네번째가 순서대로 오는 것을 확인할 수 있었다.
1. 우선 빈 문자열과 빈 리스트를 사용해서 사용하려고 했다.
2. s를 리스트로 만들고, 리스트를 문자열 길이로 정렬한 다음 처리를 시작하려고 했다.
3. , 인지, { 인지, } 인지를 모두 구분해주면서 오는 값들을 조건을 만들어 처리해야겠거니 했다. 하지만 근데 이게 여간 어려운게 아니었다. 스택을 만들어서 { 를 담고 } 를 만나면 pop하고 그 안에 값들을 처리하려고 했는데 그 안에 과정에서 계속 꼬이는 문제가 반복됐다.
사실 여기까지 작성하면서 보니 [[2],[2,1],[1,2,3],[1,2,4,3]] 으로 만드는 방법에 대해 더 고민해봤다면, 어떻게든 처리할 수 있을 수 있었겠다 싶은 생각도 있다.. 하지만 더 좋은 풀이를 보아야 하니 패쓰
정답 풀이
def solution(s):
s = s[2:-2]
k = s.split('},{')
k.sort(key=len)
answer = []
for i in k:
tmp = i.split(",")
for j in tmp:
if int(j) not in answer:
answer.append(int(j))
return answer
정렬에 대한 생각은 맞았다!
하지만, 저런 방식으로 split을 활용할 줄은 몰랐다.. 매일 , 과 공백으로만 split해주는 거에 익숙해져있어 저런 방식으로 처리해주는 것은 익숙하지 않았던 듯 하다.. 이참에 문자열 처리에 대해서는 지금 사용하고 있는 함수에 조금 더 많은 이해와 노력이 필요하지 않을까 싶기도 하다.
어지됐든 저 split하나로 이미 풀이 설명은 충분히 되었을 것이라고 본다!
프로그래머스에서 다른 분들의 풀이를 보니 조금 더 쉬운 풀이가 있었다
충격적인 라이브러리가 있다. 바로 counter라는 라이브러리다..
카운터는 각 요소의 수를 보유하는 컨테이너다. 예를 들면 [1,1,2,3,3,4,4,4]가 있으면
counter를 활용해서 {1:2,2:1,3:2,4:3}으로 개수를 세어주는 기능이 있다.
여기에 정규식 표현을 더해 사용해주면 금상첨화더라... 이런 정규 표현식 기능에도 익숙해져야겠다 싶더라!
정답 풀이2
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)]))
import re
from collections import Counter
레벨 2의 문제였지만, 정말 이런걸 코테에서 만나면 많이 당황하겠거니 싶기도 하다. 하지만 언젠간 또 익숙해지면 풀 수 있겠지
이번에 기억해두고 꼭 써먹어보자
요약 : 내가 아는 그함수를 다시 한번 생각해보자! 문제를 푸는 키가 될 지어다(split)
배울점 : Counter, findall, 정규표현식
'Algorithm' 카테고리의 다른 글
[프로그래머스] Lv.2 k진수에서 소수 구하기 (0) | 2023.02.09 |
---|---|
[프로그래머스] Lv.2 뉴스 클러스터링 (0) | 2023.02.09 |
[백준 #1309 파이썬] 동물원 (0) | 2023.01.27 |
동적 계획법(Dynamic Programming) 에 대한 이해 (0) | 2023.01.13 |
DP 풀이 팁! (0) | 2023.01.06 |