[python] 프로그래머스 –


출처: 프로그래머, https://school.programmers.co.kr/learn/courses/30/lessons/64065

프로그램 제작자

코드 중심 개발자를 고용하십시오. 배치 기반 위치 매칭. 프로그래머의 개발자별 프로필에 가입하고 기술 호환성이 좋은 회사와 연결하십시오.

Programmer.co.kr

더보기


설명

# 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


내가 배운 것

더 나은 솔루션

조금 더 생각해보면 좋은 해결책이 있습니다.

마지막으로 set-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

GitHub – bh2980/algorithm problem: 알고리즘 솔루션 트레이스

알고리즘 솔루션 추적. GitHub에서 계정을 생성하여 bh2980/Algorithm 이슈 개발에 기여하십시오.

github.com