728x90
https://programmers.co.kr/learn/courses/30/lessons/72411?language=python3
문제 풀이
for course in course:
for order in orders:
n_order = ''.join(sorted(order))
for combo in [''.join(i) for i in list(combinations(n_order, course))]:
if combo in combos[course-1]: combos[course-1][combo] += 1
else: combos[course-1][combo] = 1
파이썬 라이브러리 itertool 중 combinations(조합)을 이용해서
orders에 대한 조합들을 다 dict의 키 값으로 때려 박는다.
여기서 order 중에 알파벳 순서로 정렬이 안된 값이 있어 정렬을 해야 한다.
dict가 course의 max 값만큼 있는 이유는 course에 따라 정리를 하기 위함이다.
for combo in combos:
for c in list(combo.keys()):
if combo[c] < 2: del combo[c]
각 dict에 대해 주문된 횟수가 2 미만의 값은 정리한다.
for combo in combos:
if combo:
max_val = max(combo.values())
for ele in combo:
if combo[ele] == max_val: answer.append(ele)
각 코스에 최대 주문 회수를 찾아 결과 리스트에 넣어준다.
느낀 점
combinations을 몰랐다면 백트래킹으로 직접 구현했을 것 같다. 그 생각만 하니 엄청 아찔하다..
중간에 발생하는 에러들 (TypeError, ValueError) 때문에 정말 정신이 나가는 줄 알았다.
특히 'for course in course: ' 문이 위에서는 되는데 왜 아래에선 안되는지 미치는 줄 알았다...
코테 생각하면 아직 막막하다..
코드
from itertools import combinations
def solution(orders, course):
answer = []
combos = [{} for i in range(course[-1])]
for course in course:
for order in orders:
n_order = ''.join(sorted(order))
for combo in [''.join(i) for i in list(combinations(n_order, course))]:
if combo in combos[course-1]: combos[course-1][combo] += 1
else: combos[course-1][combo] = 1
for combo in combos:
for c in list(combo.keys()):
if combo[c] < 2: del combo[c]
for combo in combos:
if combo:
max_val = max(combo.values())
for ele in combo:
if combo[ele] == max_val: answer.append(ele)
return sorted(answer)
'문제 풀이 > 프로그래머스 (Programmers)' 카테고리의 다른 글
[Python] 프로그래머스 : 거리두기 확인하기 (0) | 2022.06.26 |
---|---|
[Python] 프로그래머스 : 괄호 변환 (0) | 2022.06.23 |
[Python] 프로그래머스 : 내적 (0) | 2022.06.22 |
[Python] 프로그래머스 : 음양 더하기 (0) | 2022.06.22 |
[Python] 프로그래머스 : 없는 숫자 더하기 (0) | 2022.06.22 |
댓글