알고리즘 스터디 2021.07~

[프로그래머스] 2021 카카오 메뉴 리뉴얼

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

 

코딩테스트 연습 - 메뉴 리뉴얼

레스토랑을 운영하던 스카피는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다. 기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서

programmers.co.kr


풀이

 

되게 비효율적인 전탐색 방법 밖에 떠오르지 않았다.

파이썬 모듈을 잘 모르다 보니 분명 내가 생각하는 조합 방법이 하드코딩일 것 같았다.

백퍼 이런 기능을 제공해주는 모듈이 있을 것 같았다.

어떤 모듈을 사용하는지 검색해 참고해보았다. 풀이는 덜 보려고 노력함 ( https://dev-note-97.tistory.com/128 )

from itertools import combinations
from collections import Counter

collections는 써본 적 있었다.

from collections import Counter

Counter('hello world') # Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1})

이런 형태로 리턴해주는 듯 하다. (https://www.daleseo.com/python-collections-counter/)

 

itertools.combinations 도 언젠가 써본 듯 했던 것 같기도 하다.

import itertools

chars = ['A', 'B', 'C']

p = itertools.permutations(chars, 2)  # 순열
c = itertools.combinations(chars, 2)  # 조합

print(list(p))
print(list(c))

#[('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]
#[('A', 'B'), ('A', 'C'), ('B', 'C')]

(https://itholic.github.io/python-combination-permutation/)

 

 

내 풀이

from itertools import combinations
from collections import Counter

def solution(orders, course):
    menus = []
    for c in course:
        for o in orders:
            menus += list(combinations(o, c))
    
    results = list(map(''.join, menus))
    count = Counter(results)
    
    print(count)
    
    #	Counter({'XY': 2, 'XZ': 1, 'YZ': 1, 'XW': 1, 'WY': 1, 'WX': 1, 'WA': 1, 'XA': 1, 'XYZ': 1, 'XWY': 1, 'WXA': 1})
    
    return []

카운터 모듈로 총 몇 개의 조합이 몇 번 나왔는지까지는 구했다 최대 조합의 개수 꺼내는 중

from itertools import combinations
from collections import Counter

def solution(orders, course):
    answers = []
    for c in course:
        menus = []
        for o in orders:
            menus += list(combinations(sorted(o), c)) // sorted안해주면 counter에서 같은 값으로 쳐주지 않는듯
        
        results = list(map(''.join, menus))
        count = Counter(results)
        
        if len(count) != 0 and max(count.values()) != 1:
            for i in count:
                if count[i] == max(count.values()):
                    answers.append(i)
    
    return sorted(answers)

위처럼 하면 두개, 세개 등 개수가 다른 조합이 섞여 최대값을 뽑기 어려워 답을 저장하고 비워버리는 방식으로 변경했다.

순열이다보니까 xy , yx를 같은 것으로 치는데 counter에서는 다른 것으로 쳐서 테스트케이스 3번에서 틀리게 나왔다.

sorted(o)를 걸어줘서 그럴 일이 없도록 했다. 위 링크의 블로그를 많이 참고했다.