본문 바로가기
프로그래머스/Python

[프로그래머스] 메뉴 리뉴얼 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2023. 11. 7.
728x90
반응형

 

 

프로그래머스

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

programmers.co.kr

 

1. 문제 설명

2. 풀이과정

해당 문제는 단품 메뉴 2개 이상으로 구성된 가능한 코스요리를 구하는 문제이다.

코스요리를 구성하는 단품 메뉴의 개수에 따라 코스요리의 가능한 모든 조합의 결과를 구하고 해당 조합을 바탕으로 각 코스요리가 얼마나 주문되었는지 구한다.

손님 2명 이상이 주문한 메뉴 중 가장 많은 횟수로 주문된 코스요리 후보를 구한다.

각 코스요리의 개수에 따른 모든 코스요리 후보를 구했다면 해당 후보들을 오름차순으로 정렬한다.

 

  1. 조합의 결과를 combinations() 함수로 구하기 위해 해당 함수를 불러온다. from itertools import combinations
  2. 각 코스요리의 개수를 하나씩 불러온다. for i in course
  3. 각 가능한 코스요리와 그 개수를 저장할 딕셔너리를 생성한다. d = {}
  4. 각 손님이 주문한 단품 메뉴를 불러온다. for j in orders
  5. 하나의 문자열로 이루어진 단품 메뉴를 각 문자로 나누어 리스트로 저장한다. j = list(j)
  6. 해당 리스트를 오름차순으로 정렬한 결과에서 코스요리의 개수만큼 선택하는 모든 조합의 결과를 리스트로 추출해 각 조합의 결과를 하나씩 불러온다. for k in list(combinations(sorted(j), i))
  7. 만약 딕셔너리에 해당 조합이 이미 존재하면 if (k in d)
  8. 해당 조합의 개수를 1 증가시킨다. d[k] += 1
  9. 반면에 해당 조합이 처음 나오는 조합이라면 else
  10. 해당 조합을 딕셔너리에 새로 추가한다. d[k] = 1
  11. 만약 해당 딕셔너리에 저장된 조합이 1개라도 있으면 if (len(d) > 0)
  12. 각 조합이 나온 횟수의 최댓값을 저장한다. MAX = max(d.values())
  13. 만약 최댓값이 1보다 크면 (주문한 손님이 2명 이상일 때) if (MAX > 1)
  14. 최댓값을 value로 갖는 key를 찾아 리스트로 저장한다. li = [k for k, v in d.items() if v == MAX]
  15. 저장한 리스트의 결과를 하나씩 불러오며 for j in li
  16. 각 코스요리의 메뉴를 하나의 문자열로 저장하고 word = ''.join(j)
  17. 해당 코스요리가 처음 나오는 코스요리라면 if (word not in answer)
  18. 해당 코스요리를 추가한다. answer.append(word)
  19. 코스요리 후보를 모두 구했다면 오름차순으로 정렬한다. answer.sort()
반응형

3. 소스코드

from itertools import combinations

def solution(orders, course):
    answer = []
    
    for i in course:
        d = {}
        for j in orders:
            j = list(j)
            for k in list(combinations(sorted(j), i)):
                if (k in d):
                    d[k] += 1
                else:
                    d[k] = 1

        if (len(d) > 0):
            MAX = max(d.values())

            if (MAX > 1):
                li = [k for k, v in d.items() if v == MAX]

        for j in li:
            word = ''.join(j)
            if (word not in answer):
                answer.append(word)
        
    answer.sort()
    return answer
728x90
반응형