2021. 9. 7. 11:19ㆍdev
https://programmers.co.kr/learn/courses/30/lessons/64065
풀이과정
중복되는 원소가 없는 튜플을 집합기호로 표현된 입력이 주어진다. 예를들어 튜플이 (2, 1, 3, 4)인 경우
{{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}
{{2, 1, 3, 4}, {2}, {2, 1, 3}, {2, 1}}
{{1, 2, 3}, {2, 1}, {1, 2, 4, 3}, {2}} 는 모두 같은 튜플 (2, 1, 3, 4)를 나타낸다.
처음엔 튜플에서 원소가 순서에 영향 받는다면서 집합기호로 쓰면 순서가 바뀌어도 된다니 무슨말인지 헷갈렸다.
세번째 케이스를 보면, [111, 20]은 {111}, {111, 20} 또는 {111}, {20, 111} 이렇게 순서가 바뀌어도 모두 같은 튜플 (111, 20)을 나타낸다. 튜플 안에서만 원소의 순서를 지키면 되는것인데, 이때 문자열 s에서 가장 빈번하게 나온 숫자부터 차례대로 리스트에 담긴것을 확인할 수 있다.
1. 정규표현식
문자열 s에서 숫자만 뽑아 리스트화 시키려고 한다. 주의할점은 (\d)만 사용해서 매치시킨다면 케이스 3번의 경우 ['111'] 이 아니라 ['1', '1', '1'] 으로 저장된다. 따라서 숫자가 1회이상 반복되면 매치시키도록 (\d+)를 사용해준다.
s = "{{20,111},{111}}"
s = re.findall('\d+', s)
print(s) # ['20', '111', '111']
2. 중복원소 카운팅
문자열 "{{2},{2,1},{2,1,3},{2,1,3,4}}"의 반환 결과를 보면 [2, 1, 3, 4] 즉, 가장 많이 등장한 횟수대로 저장되어있다. Counter를 사용해서 카운팅 해주었다.
count = Counter(s)
print(count) # Counter({'2': 4, '1': 3, '3': 2, '4': 1})
3. 내림차순 정렬 및 반환
먼저, 리스트 탐색을 위해 딕셔너리 형태를 튜플로 바꿔주고, 1번째 인덱스를 기준으로 내림차순 정렬하고 인덱스 0번째 값을 int로 변환해 답을 구했다.
전체 코드
import re
from collections import Counter
def solution(s):
answer = []
s = re.findall('\d+', s)
count = Counter(s)
d = list(zip(count.keys(), count.values()))
d = sorted(d, key = lambda x:-x[1])
for e in d:
answer.append(e[0])
answer = map(int, answer)
answer = list(map(int, answer))
return answer
'dev' 카테고리의 다른 글
[프로그래머스] 비밀지도 Python (카카오 기출) (0) | 2021.09.09 |
---|---|
Python 딕셔너리를 튜플 리스트로 변환 (0) | 2021.09.07 |
JS기초 | Ajax, JSON 개념정리 및 활용방법 (0) | 2021.08.24 |
Python 딕셔너리 자료형 (0) | 2021.08.18 |
[프로그래머스] 오픈채팅방 (Python) (0) | 2021.08.13 |