오늘은 여기까지
[프로그래머스] 메뉴 리뉴얼 - Python 파이썬 본문
https://school.programmers.co.kr/learn/courses/30/lessons/72411
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
접근방법
1. 코스의 요리 개수를 기준으로 가능한 조합을 구한다.
2. 주문내역을 돌면서 가능한 조합을 구한다.
3. 각 조합의 주문 횟수를 센다.
4. 가장 많이 주문된 조합을 정답에 추가한다.
2개의 요리로 만들 수 있는 조합을 구하기로 한다.
- 주문내역에서 2개를 선택한 조합을 구한다.
- 각 조합이 몇 번 주문됐는지 센다.
- 최대 주문 횟수만큼 주문된 조합을 정답에 추가한다.
3개의 요리로 만들 수 있는 조합을 구한다.
... (반복)
전체코드
from itertools import combinations
from collections import Counter
def solution(orders, course):
answer = []
for length in course:
candidates = []
for order in orders:
order = sorted(order) # 주문을 정렬하여 'AB'와 'BA'를 같은 것으로 처리
combi = combinations(order, length)
candidates.extend(''.join(c) for c in combi)
# 각 조합이 몇 번 등장했는지 세기
menu_count = {}
for candidate in candidates:
if candidate in menu_count:
menu_count[candidate] += 1
else:
menu_count[candidate] = 1
# menu_count가 비어있지 않고, 가장 많이 등장한 횟수가 2 이상인 경우
if menu_count and max(menu_count.values()) >= 2:
max_count = max(menu_count.values())
for menu, count in menu_count.items():
if count == max_count:
answer.extend([menu])
return sorted(answer)
해설을 찾아봤는데 파이썬의 Counter 클래스를 활용해 주문 횟수를 세는 풀이도 있더라. 파이썬 라이브러리를 잘 활용하자
Counter를 사용한 코드
from itertools import combinations
from collections import Counter
def solution(orders, course):
answer = []
for length in course:
candidates = []
for order in orders:
order = sorted(order)
combi = combinations(order, length)
candidates.extend(''.join(c) for c in combi)
# 조합별 등장 횟수 계산
counter = Counter(candidates)
# 조합이 있고, 최소 2번 이상 주문된 경우
if counter and max(counter.values()) >= 2:
max_count = max(counter.values())
answer.extend([menu for menu, count in counter.items()
if count == max_count])
return sorted(answer)
Counter 사용 예시
- 자동으로 요소의 개수를 세어준다.
counter = Counter(['AB', 'AC', 'BC', 'AB', 'AC', 'CD'])
print(counter)
# Counter({'AB': 2, 'AC': 2, 'BC': 1, 'CD': 1})
- 딕셔너리처럼 접근할 수 있다.
- values(), items() 등 딕셔너리 메서드를 사용할 수 있다.
- most_common()이라는 메서드도 제공한다.
# counter.items()는 (메뉴, 등장횟수) 튜플을 반환
for menu, count in counter.items():
print(f"{menu}: {count}번 등장")
# 출력:
# AB: 2번 등장
# AC: 2번 등장
# BC: 1번 등장
# CD: 1번 등장
'Problem Solving' 카테고리의 다른 글
[백준/1931] 회의실 배정 - Java 자바 (0) | 2024.11.05 |
---|---|
[백준/18230] 2xN 예쁜 타일링 - Java 자바 (1) | 2024.11.05 |
[프로그래머스] 신고 결과 받기 - Java 자바 (0) | 2024.10.30 |
[프로그래머스] 베스트 앨범 - Java 자바 (0) | 2024.10.29 |
[프로그래머스] 할인 행사 - Java 자바 (2) | 2024.10.25 |