이 포스팅은 프로그래머스 시리즈 28 편 중 4 번째 글 입니다.

  • Part 1 - 01: 다리를 지나는 트럭
  • Part 2 - 02: 멀정한 사각형
  • Part 3 - 03: 더 맵게
  • Part 4 - This Post
  • Part 5 - 05: 전화번호 목록
  • Part 6 - 06: 가장 큰 수
  • Part 7 - 07: 예상 대진표
  • Part 8 - 08: 다단계 칫솔 판매
  • Part 9 - 09: 불량 사용자
  • Part 10 - 10: 베스트 앨범
  • Part 11 - 11: 합승 택시 요금
  • Part 12 - 12: 스타 수열
  • Part 13 - 13: 위장
  • Part 14 - 14: 주식 가격
  • Part 15 - 15: 디스크 컨트롤러
  • Part 16 - 16: N으로 표현
  • Part 17 - 17: 전화번호 목록
  • Part 18 - 18: 단어 변환
  • Part 19 - 19: 여행 경로
  • Part 20 - 20: 프린터
  • Part 21 - 21: 후보키
  • Part 22 - 22: 삼각 달팽이
  • Part 23 - 23: 실패율
  • Part 24 - 24: 입국심사
  • Part 25 - 26: 기둥과 보 설치
  • Part 26 - 27: 광고 삽입
  • Part 27 - 28: 퍼즐 조각 채우기
  • Part 28 - 29: 상호 평가
▼ 목록 보기

목차

▼ 내리기

풀이

처음에는 각각의 order의 메뉴와 다음 메뉴와의 교집합을 사용해서 풀려고 했으나 문제는, 결국 몇번 시켰는지 알아내야 한다는 점에서 막혔다. 그래서 combination을 통해 모든 course 개수만큼의 조합을 구하고 이를 세어서 dictionary에 저장한 후 count를 기반으로 sorting하여 가장 많이 선택된 녀석을 정답 배열에 넣는 방법으로 진행했다.

Code

from itertools import combinations

def solution(orders, course):
    answer = []
    
    for c in course:
        temp = []
        counter = dict()
        for o in orders:
            temp.extend(list(combinations(sorted(o), c)))
        
        A = set(temp)
        for a in A:
            counter[a] = temp.count(a)
        
        counter = sorted(counter.items(), key=lambda x: x[1], reverse=True)
        answer.extend(["".join(list(x[0])) for x in counter if x[1] > 1 and x[1] == counter[0][1]])
    
    answer = sorted(answer)
    return answer

근데 누가 Counter라는 것을 알려주었다.

import collections
import itertools

def solution(orders, course):
    result = []

    for course_size in course:
        order_combinations = []
        for order in orders:
            order_combinations += itertools.combinations(sorted(order), course_size)

        most_ordered = collections.Counter(order_combinations).most_common()
        result += [ k for k, v in most_ordered if v > 1 and v == most_ordered[0][1] ]

    return [ ''.join(v) for v in sorted(result) ]

다른 건 코드짜는 방식의 차이이지만 집합 쓰고 dictionary썼던 것을 collections의 Counter를 써서 할 수 있는 점은 새롭다. 외워두자.