프로그래머스 코딩테스트 고득점 Kit의 문제입니다.
https://programmers.co.kr/learn/challenges?tab=algorithm_practice_kit
문제
https://programmers.co.kr/learn/courses/30/lessons/72411
내가 작성한 코드
from itertools import combinations
from collections import Counter
def solution(orders, course):
answer = []
for k in course:
result = []
for s in orders:
for v in combinations(list(s), k):
result.append(''.join(sorted(v)))
result = Counter(result)
for i in range(2, len(result)+2):
res = result.most_common(i)
if res[i-2][1] == 1:
break
answer.append(res[i-2][0])
if i-1 < len(result) and res[i-2][1] != res[i-1][1]:
break
return sorted(answer)
- 각 문자의 combination후 정렬한 문자열을 key로 하는 Counter 생성
- most_common을 2개씩 뽑음
- 첫 번째 인자의 frequency가 1이면 종료
- 첫 번째 인자를 결과로 append
- 두 번째 인자가 첫 번째 인자의 frequency와 같다면 다음 most_common도 확인
- 정말 지저분한 코드다
다른 사람이 작성한 코드
import collections
import itertools
def solution(orders, course):
result = []
for course_size in course:
order_combinations = []
for order in orders:
order_combinations += itertools.combinations(sorted(order), course_size)
most_ordered = collections.Counter(order_combinations).most_common()
result += [ k for k, v in most_ordered if v > 1 and v == most_ordered[0][1] ]
return [ ''.join(v) for v in sorted(result) ]
- 정말 이쁘게 잘 정리했다
- most_common 전체를 돌면서 most_common의 첫번째 frequency랑 같고, 1보다 크면 append 시킨다
기억해야할 것
- 나는 for문에서 탐색을 멈춰야할 때는 break를 꼭 집어넣어야 한다고 생각한다
- 그게 효율적으로 좋을 수는 있다(매우 매우 조금...)
- 뭔가 보편적인? 일반화된 로직과 알고리즘을 생각하는 훈련을 해야겠다
'코딩테스트' 카테고리의 다른 글
[백준][문자열] AC (0) | 2021.08.10 |
---|---|
[백준][문자열] 전화번호 목록 (0) | 2021.08.10 |
[백준][문자열] 문자열 폭발 (0) | 2021.08.10 |
[프로그래머스][KAKAO_BLIND][2021] 광고 삽입 (0) | 2021.08.07 |
[프로그래머스][KAKAO_BLIND][2021] 신규 아이디 추천 (0) | 2021.08.07 |