카카오 2021 #2 - 메뉴 리뉴얼

ims·2021년 6월 25일
0
post-custom-banner

📌 문제

손님이 시킨 메뉴가 있다. ex) A,B,D // B,C,D // A,B,D,E

메뉴 항목이 2명 이상의 손님한테 중복될 때, course 해당하는 메뉴의 최대값을 추출하려고 한다.

course = [2,3] 이라면 메뉴가 2개 중복된 메뉴 중 최대로 많이 중복된 메뉴 / 3개 중복된 메뉴 중 최대로 많이 중복된 메뉴를 추출하는 것이다.

위의 예에서는 2개 중복은 A,B 가 2회 // B,D가 3회, // A,D가 2회 // 나머지 항목은 모두 1회 이므로 "BD"를 결과에 추가한다.

3개 중복은 A,B,D가 유일하므로 "ABD"를 결과에 추가한다.

그래서 결과는 ["ABD","BD"] 이다. ( 사전순으로 정렬하라 )

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

📌 아이디어 & 풀이

예시값
solution(["XYZ", "XWY", "WXA"],[2,3,4])

🔥 1.

각 경우의 수를 모두 센다? -> combination

🔥 2.

해당 값에 key에 대한 value를 추출한다? -> map

def convert(s):
    result = ""
    for x in s:
        result +=x
    return result

def solution(orders, course):
    hash_map = dict()
    s_arr = []

    for order in orders:
        for num in course:
            c_arr = list(combinations(order,num))
            for c in c_arr:
                s_arr.append(convert(c))
s_arr 결과값
['XY', 'XZ', 'YZ', 'XYZ', 'XW', 'XY', 'WY', 'XWY', 'WX', 'WA', 'XA', 'WXA']

🔥 3.

Combination을 하면 XY와 YX가 다르게 집계가 된다. 그래서 hash_map의 key값을 확인하기 전에, 정렬 후 넣어주어야 한다.

for s in s_arr:
    temp_arr = []
    for t in s:
        temp_arr.append(t)
    temp_arr.sort()
    sub_s = ""

    for t in temp_arr:
        sub_s += t

    if sub_s in hash_map:
        hash_map[sub_s]+=1
    else:
        hash_map[sub_s]=1
hash_map 값
{'XY': 2, 'XZ': 1, 'YZ': 1, 'XYZ': 1, 'WX': 2, 'WY': 1, 'WXY': 1, 'AW': 1, 'AX': 1, 'AWX': 1}

🔥 4.

각 길이에 따른 최대값을 추출한다.

for num in course:
    max_value = 0
    for s in hash_map:
        if len(s)==num:
            max_value = max(max_value,hash_map[s])
    for s in hash_map:
        if hash_map[s]==max_value and len(s)==num and hash_map[s]>=2:
            result.append(s)
result.sort()
return result

📌 실수

🔥 1.

만약 2개에 해당하는 메뉴를 추출한다고 하면 조합을 이용해서 구해야 하는데, 잘못 생각해서

for num in orders:
    for i in range(len(arr)-1):
        arr[i:i+num] # --> 추출된 단어

위와 같이 생각했다.

📌 코드

from itertools import combinations


def convert(s):
    result = ""
    for x in s:
        result +=x
    return result

def solution(orders, course):
    hash_map = dict()
    s_arr = []

    for order in orders:
        for num in course:
            c_arr = list(combinations(order,num))
            for c in c_arr:
                s_arr.append(convert(c))
    for s in s_arr:
        temp_arr = []
        for t in s:
            temp_arr.append(t)
        temp_arr.sort()
        sub_s = ""

        for t in temp_arr:
            sub_s += t

        if sub_s in hash_map:
            hash_map[sub_s]+=1
        else:
            hash_map[sub_s]=1

    result = []

    for num in course:
        max_value = 0
        for s in hash_map:
            if len(s)==num:
                max_value = max(max_value,hash_map[s])
        for s in hash_map:
            if hash_map[s]==max_value and len(s)==num and hash_map[s]>=2:
                result.append(s)
    result.sort()
    return result
profile
티스토리로 이사했습니다! https://imsfromseoul.tistory.com/ + https://camel-man-ims.tistory.com/
post-custom-banner

0개의 댓글