출처 : 프로그래머스, https://school.programmers.co.kr/learn/courses/30/lessons/64065
더보기
풀이
# string으로 들어오기 때문에 먼저 int의 집합으로 만들어줘야한다.
# 당장은 효율적으로 하는 방법이 떠오르지 않기 떄문에 무식하게 해보자
# 각 집합으로 만들었다면, 길이순으로 정렬한다
# 길이가 작은 것부터 기존과 여집합을 구하여 answer에 차례대로 쌓는다.
def solution(s):
answer = []
num_list = []
use_num_set = set()
for num_string in s[2:len(s) - 2].split('},{'):
num_list.append(set(map(int, num_string.split(','))))
num_list.sort(key = lambda x: len(x))
for num_set in num_list:
left_element = ((num_set | use_num_set) - (num_set & use_num_set)).pop()
use_num_set.add(left_element)
answer.append(left_element)
return answer
알게 된 점
더 좋은 풀이
조금만 더 생각해보면 좋은 풀이가 존재한다.
결국 집합 리스트는 튜플의 앞에서부터 하나씩 포함시켜가며 순서가 랜덤인 배열이기 때문에
들어온 input에서 숫자를 모두 추출했을 때, 가장 빈도가 높은 숫자가 가장 처음으로 온다.
그 다음 빈도가 높은 숫자는 2번째로 그 다음은 세번째로 들어오기 때문에
string상에서 숫자를 추출해서 개수를 세고 가장 많은 순서대로 list에 넣으면 그게 정답이 된다.
import re
from collections import Counter
def solution(s):
#정규 표현식을 통해 연속된 숫자를 모두 추출하고, Counter를 통해 각 숫자의 개수를 센다.
p = Counter(re.findall('\d+', s))
#Counter를 items 함수를 통해 iterate할 수 있게 만들고 list로 만든 후 빈도에 따라 정렬한다.
#그 후 숫자만 가져와 숫자형으로 만들어 return 한다.
return list(map(int, [k for k, v in sorted(list(p.items()), key = lambda x: -x[1])]))
Github
'알고리즘 > Python' 카테고리의 다른 글
[python] 프로그래머스 - 오픈채팅방 (0) | 2023.03.09 |
---|---|
[python] 프로그래머스 - k진수에서 소수 개수 구하기 (0) | 2023.03.09 |
[python] 프로그래머스 - 멀리 뛰기 (1) | 2023.03.09 |
[python] 프로그래머스 - 개인정보 수집 유효기간 (0) | 2023.03.09 |
[python] 프로그래머스 - 성격 유형 검사하기 (0) | 2023.03.09 |