2021 KAKAO BLIND RECRUITMENT Q2. 메뉴 리뉴얼

조성권·2021년 8월 4일
0

Q2. 메뉴 리뉴얼

Programmers를 통해 공개되어 있는 문제를 통해 알고리즘 역량을 향상시키고자 작성하고 있습니다.
알고리즘의 허점이나 더 간결한 아이디어가 있다면 언제든 지적해주세요.

1. 문제 유형

  1. 문제 설명

문제 조건

문제에 대한 더 상세한 설명은 다음 URL을 통해 접속하면 알 수 있다.

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

2. 소스 코드

본인은 Python을 통해 문제를 해결하였다.

from itertools import combinations
from collections import Counter

def solution(orders, course):
    answer = []
    
    for c in course:
        tmp = []
        for order in orders:
            combi = combinations(sorted(order), c)
            tmp += combi
        
        counter = Counter(tmp)
        
        if len(counter) != 0 and max(counter.values()) > 1:
            answer += [''.join(f) for f in counter if counter[f] == max(counter.values())]
    
    answer.sort()
    return answer

3. 문제 풀이

이 문제는 조합(Combination)을 활용해서 푸는 것이 핵심이다.

  • 순열(Permutation): 순서가 있는 조합. 위치와 순서가 중요하며 내부 요소가 동일하더라도 위치가 다르다면 서로 다른 것으로 구분 (중복 존재)
  • 조합(Combination): 위치와 순서를 고려하지 않으며 그렇기에 내부 값이 동일하다면 하나로 친다. (중복 제거)

라이브러리 사용

from itertools import combinations
from collections import Counter

combinations: 조합을 간편하게 사용할 수 있도록 Python에서 제공하는 라이브러리
Counter: 리스트 형태의 데이터 요소에 대해 각 요소 별, 동일한 것에 대해 카운트하고 이를 Dictionary 형태로 반환하는 라이브러리

3-1 핵심 로직

				.
                		.
tmp = []
for order in orders:
	combi = combinations(sorted(order), c)
    	tmp += combi
    
counter = Counter(tmp)
				.
                		.

combinations(list, n)

  • 반복 가능한 객체(리스트, 튜플, 문자열)에서 n개를 선택해서 나오는 모든 쌍 반환(튜플 형태)

tmp += combi

  • 반환된 모든 조합에 대해 tmp 리스트 안에 추가

counter = Counter(tmp)

  • Counter함수를 통해 tmp 요소 중, 동일한 쌍이 몇개가 있는지 카운트한 결과를 Dictionary형태로 반환한다.
  • 이를 counter를 변수에 대입한다.
			.
            		.
if len(counter) != 0 and max(counter.values()) > 1:
	answer += [''.join(f) for f in counter if counter[f] == max(counter.values())]
    			.
                	.

위 문제의 조건 중, 하나는 다음과 같다.

최소 2명 이상의 손님으로부터 주문된 단품메뉴 조합에 대해서만 코드요리 메뉴 후보에 포함하기로 했습니다.

위 조건을 만족하기 위한 if문이 다음과 같다.

if len(counter) != 0 and max(counter.values()) > 1

  • counter의 크기는 null이 아니어야 하며 조합 중, 가장 큰 조합의 값은 2 이상이어야 한다.

위 조건을 만족한다면 해당 조합을 join함수를 통해 answer 변수에 추가하는 작업을 진행한다.

4. 실행 결과

위와 같이 작성 후, 채점을 하게 되면 다음과 같이 통과하는 것을 확인할 수 있다.

마무리

오늘은 combinations, Counter함수를 사용해보는 시간을 가져봤다.
아직 완벽히 이해하지 못한 부분도 존재하지만 이해만 정확히 한다면 유용하게 사용할 수 있는 라이브러리 함수인 것 같다.
더 다양한 예제를 통해 문제를 풀고 사용해봄으로써 확실히 이해하는 과정을 거쳐야겠다.

전체소스 git 링크
https://github.com/cho876/Algorithm/blob/master/Problem/Kakao/2021_kakao_blind_recruitment_q2.py

profile
천천히, 완벽히 배워나가고자 하는 웹 서비스 엔지니어

0개의 댓글