본문 바로가기

CodingTest

의상

https://school.programmers.co.kr/learn/courses/30/lessons/42578

 

프로그래머스

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

programmers.co.kr

I. 문제 개요

의상을 최소 하나 이상 선택하는 경우의 수를 구하는 문제이다.

 

 

II. 알고리즘 및 풀이

1.  의상 분류

ans = 0
dct = dict()

for cloth in clothes:
    name, category = cloth
    if category in dct.keys():      # 이전에 본 카테고리라면
        dct[category].append(name)  # value(list)에 의상 추가
    else:                         # 처음 보는 카테고리라면
        dct[category] = [name]    # 딕셔너리에 넣기

 

딕셔너리를 선언하고, 의상을 종류별로 저장한다.

 

딕셔너리의 value는 list 형식이다.

 

2. 경우의 수 계산

    headgear:		 2 + 1(하나도 안입는 경우)
*    eyewear:		 1 + 1(안쓰는 경우)
---------------------------------------
   총 경우의 수:       	(2 + 1) * (1 + 1) - 1 
     			= 3 * 2 - 1
                  	= 6 - 1
                  	= 5

 

"예제 #1"을 기준으로 살펴보자.

 

모자를 쓰는 경우는 3가지, 안경류를 쓰는 경우는 2가지이다.

 

다만,모자와 안경류 둘 다 안쓰는 경우 1개는 제외해야 한다.

 

따라서, 구하려는 경우의 수는 3 * 2 에서 1을 뺀, 5가 답이다.

 

이를 코드로 옮기면 아래와 같다.

 

for cat in dct.keys():
    combi = len(dct[cat]) + 1   # 경우의 수 = (의상의 갯수) + 1(안입는 경우)
    if ans == 0:                # ans가 초기화된 상태라면
        ans = combi             # combi로 초기화
    else:
        ans *= combi            # 곱하기로 계산

return ans - 1   # 하나도 안입는 경우는 제외

 

각 종류별로 의상을 1개 이하로 선택하는 경우의 수를 구한 값들을  모두 곱한다.

 

여기에서 1을 빼면 구하려는 경우의 수를 구할 수 있다.

 

III. 전체 코드

def solution(clothes):
    # 1. 의상 분류
    ans = 0
    dct = dict()
    
    for cloth in clothes:
        name, category = cloth
        if category in dct.keys():      # 이전에 본 카테고리라면
            dct[category].append(name)  # value(list)에 의상 추가
        else:                       # 처음 보는 카테고리라면
            dct[category] = [name]  # 딕셔너리에 넣기
    
    # 2. 경우의 수 계산
    for cat in dct.keys():
        combi = len(dct[cat]) + 1   # 경우의 수 = (의상의 갯수) + 1(안입는 경우)
        if ans == 0:                # ans가 초기화된 상태라면
            ans = combi             # combi로 초기화
        else:
            ans *= combi            # 곱하기로 계산
    
    return ans - 1   # 하나도 안입는 경우는 제외

 

IV. 제출 결과

'CodingTest' 카테고리의 다른 글

정수 삼각형  (0) 2024.04.22
N으로 표현  (0) 2024.04.20
전화번호 목록  (0) 2024.04.17
리코쳇 로봇  (1) 2024.04.16
요격 시스템  (0) 2024.04.16