개발 블로그
[Programmers/파이썬] 프로그래머스(Lv.2) 메뉴 리뉴얼 문제풀이 본문
문제 설명
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 개수 마다 조합 구해서 최빈값 찾는 완전 탐색 해야지! 하고 방향을 잘 잡고 푼 것 같다.
'Algorithm' 카테고리의 다른 글
[Programmers/파이썬] 프로그래머스(Lv.1) 로또의 최고 순위와 최저 순위 문제풀이 (0) | 2024.08.18 |
---|---|
[Programmers/파이썬] 프로그래머스(Lv.2) 괄호 회전하기 문제풀이 (0) | 2024.08.18 |
[Programmers/파이썬] 프로그래머스(Lv.2) 쿼드압축 후 개수 세기 문제풀이 (0) | 2024.08.17 |
[Programmers/파이썬] 프로그래머스(Lv.2) 수식 최대화 문제풀이 (4) | 2024.08.17 |
[Programmers/파이썬] 프로그래머스(Lv.1) 키패드 누르기 문제풀이 (0) | 2024.08.17 |