Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
more
Archives
Today
Total
관리 메뉴

개발 블로그

[Programmers/파이썬] 프로그래머스(Lv.2) 메뉴 리뉴얼 문제풀이 본문

Algorithm

[Programmers/파이썬] 프로그래머스(Lv.2) 메뉴 리뉴얼 문제풀이

토산인 2024. 8. 18. 10:32

문제 설명

https://school.programmers.co.kr/learn/courses/30/lessons/72411

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

사고 흐름

1. orders 길이 20이하, course 길이 10이하인 것을 보고 ->  완전탐색 (course만큼 orders에서 찾자)

2. course 개수에 맞는 모든 조합을 따져야겠다 -> 손님마다 조합 계산 

3. 카운터 이용해 가장 많은 조합 추출 

 

문제 핵심과 알고리즘

완전 탐색 + 조합  

 

from itertools import combinations
from collections import Counter

def solution(orders, course):
    answer = []
    
    for c in course :
        combi = []
        for order in orders :
            order = sorted(order)
            combi.append(list(map(''.join, combinations(order, c))))
        combi = sum(combi, [])
        counter = Counter(combi).most_common()
        if counter and counter[0][1]>1 :
            m = counter[0][1]
            answer.append([i[0] for i in counter if i[1]==m])
            
    return sorted(sum(answer, []))

 

 

문제 풀면서 헤맸던 부분

1. 2차원 배열을 1차원 배열로 바꾸기

각 손님마다 가능한 조합을 만들고 append로 추가했는데, 그러면 2차원 배열이 돼서 카운터를 쓸 수가 없다. 그래서 구글링한 결과 여러가지 방법이 있는데 가장 간단한 방법은 sum 이용하는 것. 

list1 = [[1, 10], [2, 22], [3, 19], [4, 7]]
list2 = sum(list1, [])
print(list2)	#[1, 10, 2, 22, 3, 19, 4, 7]

 

list1의 원소를 빈 배열에 넣어준다고 생각하면 된다. 이거는 나중에 사용할 것 같아서 기억해두자! 

그리고 이후에 생각하니 더 간단한 방법이 있었다. 

for c in course :
        combi = []
        for order in orders :
            order = sorted(order)
            combi += list(map(''.join, combinations(order, c)))

 

그냥 이렇게 리스트에 리스트를 더해가는 방법으로 하면 2차원 배열이 안돼서 더 간단하다! 

 

2. 여러 최빈값 찾기

most_common 으로 정렬하고 최빈값을 찾았는데, 최빈값이 여러개라면? 그냥 단순하게 for문으로 비교하면서 확인했다.. 

 

총평 

30분정도 걸렸던 문제다. 시간이 좀 걸리긴 했지만, 그래도 모든 course 개수 마다 조합 구해서 최빈값 찾는 완전 탐색 해야지! 하고 방향을 잘 잡고 푼 것 같다.