Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 자바스크립트
- dfs
- level 3
- C언어
- 동적계획법
- join
- Dynamic Programming
- 소프티어
- 프로그래머스
- SQL
- bfs
- softeer
- javascript
- SQL 고득점 KIT
- 파이썬
- Python
- 너비 우선 탐색
- Lv. 1
- Lv. 3
- DP
- select
- Java
- 깊이 우선 탐색
- Lv. 0
- Lv. 2
- group by
- LEVEL 2
- programmers
- 티스토리챌린지
- 오블완
Archives
- Today
- Total
몸과 마음이 건전한 SW 개발자
프로그래머스 [Lv. 2] 메뉴 리뉴얼 {언어 : Python} [코드 리펙토링] 본문
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/72411?language=python3
정답 코드
from collections import defaultdict
def solution(orders, course):
answer = []
orderDict = defaultdict(int)
lenC = len(course)
def addDict(arr):
stack = []
for i in range(26):
if arr[i]:
stack.append(chr(i+65))
tmp = "".join(stack)
orderDict[tmp] += 1
return
def dfs(order, lastIdx, idx, arr, wantLen, currentLen):
if idx >= lastIdx:
if wantLen == currentLen:
addDict(arr)
return
nextArr = arr[:]
nextArr[ord(order[idx])-65] = 1
dfs(order, lastIdx, idx+1, nextArr, wantLen, currentLen+1)
dfs(order, lastIdx, idx+1, arr, wantLen, currentLen)
for order in orders:
lenO = len(order)
for c in course:
dfs(order, lenO, 0, [0 for _ in range(26)], c, 0)
maxCntOrder = [1 for _ in range(11)]
slod = sorted(list(orderDict.items()), key=lambda x: x[1], reverse=True)
for item in slod:
for c in course:
if len(item[0]) == c and item[1] > maxCntOrder[c]:
maxCntOrder[c] = item[1]
for k in range(11):
if maxCntOrder[k] > 1:
for item in slod:
if len(item[0]) == k and item[1] == maxCntOrder[k]:
answer.append(item[0])
answer.sort()
return answer
코드 리펙토링
from collections import defaultdict, Counter
from itertools import combinations
def solution(orders, course):
answer = []
course_dict = defaultdict(list)
# Create combinations and count them
for order in orders:
order = ''.join(sorted(order)) # Sort to ensure combinations are consistent
for num in course:
comb_count = Counter(combinations(order, num))
for comb, count in comb_count.items():
course_dict[num].append(''.join(comb))
# Determine the most frequent combinations for each course size
for num in course:
if course_dict[num]:
counter = Counter(course_dict[num])
max_count = max(counter.values())
most_frequent = [comb for comb, count in counter.items() if count == max_count and count > 1]
answer.extend(most_frequent)
return sorted(answer)
풀이 방법
- orders의 order를 조합한다.
- order와 코스의 종류에 따라 key를 조합한다.
- 예를 들어 order가 ABCD이고 course : [2, 3, 4] 에서 2인 경우
- AB, AC, AD, BC, BD, CD 를 만들 수 있다.
- 리스트로 만든 이유는
- DCBA로 조합을 만들면 DC, DB, DA, CB, CA, BA를 만들 수 있지만 순서가 달라 다르다고 판단할 수 있다.
- 따라서 리스트의 번호로 확인해줬다.
- 예를 들어 order가 ABCD이고 course : [2, 3, 4] 에서 2인 경우
- 조합한 키를 바탕으로 해당 코스후보가 몇 번 주문되었는지 확인한다.
- 그 중 최대로 조합된 코스후보를 answer에 넣고 정렬한 뒤 반환한다.
느낀점
- 꽤 오래 걸리고 코드 가독성도 떨어져서 gpt선생님의 도움을 받아 코드를 리펙토링 했다.
- 코드 줄 수가 2배로 줄었으며 속도 또한 빠르다.
'알고리즘' 카테고리의 다른 글
프로그래머스 [Lv. 2] 쿼드압축 후 개수 세기 {언어 : Python} (0) | 2024.05.05 |
---|---|
프로그래머스 [Lv. 2] 이진 변환 반복하기 {언어 : JavaScript} (0) | 2024.05.04 |
프로그래머스 [Lv. 2] 괄호 회전하기 {언어 : JavaScript} (0) | 2024.05.03 |
프로그래머스 [Lv. 2] 2개 이하로 다른 비트 {언어 : Python} (0) | 2024.05.02 |
프로그래머스 [Lv. 2] 할인 행사 {언어 : Python} (0) | 2024.04.29 |