[프로그래머스] 튜플 Python (카카오 기출)

2021. 9. 7. 11:19dev

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

 

풀이과정 

중복되는 원소가 없는 튜플을 집합기호로 표현된 입력이 주어진다. 예를들어 튜플이 (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