본문 바로가기
Algorithm/Programmers

[프로그래머스] 코딩테스트 고득점 Kit > 위장

by du.it.ddu 2019. 11. 5.
반응형

# 문제

# 문제 접근

문제를 읽고 처음 입출력 예를 보고 나면 의상의 종류와 의상들을 묶어서 가능한 조합들을 모두 구하면 되겠다고 생각할 수 있다. 하지만 조금만 생각해보면 의상의 종류와 그 종류가 몇 개의 의상이 있는지만 알면 경우의 수를 구할 수 있다. 또한 같은 이름을 가진 의상이 존재하지 않기 때문에 별다른 예외처리도 필요 없음을 짐작할 수 있다.

따라서 의상의 종류가 "키"가 되고 의상의 개수가 "값"이 되는 딕셔너리를 생성하여 문제를 풀 수 있을 것이다.

# 문제 풀이

1. "의상의 종류 : 의상의 개수" 의 구조를 가진 딕셔너리를 생성한다.

2. clothes 리스트를 순회하며 딕셔너리에 저장한다.

3. 딕셔너리를 순회하며 경우의 수를 구하여 반환한다.

4. 경우의 수를 구하는 것은 수학적인 지식이 필요하다. 아래를 참고한다.

세 가지 옷 A, B, C가 있고 개수가 a, b, c라고 하면,

A를 선택하는 경우 a가지가 발생하며 선택하지 않은 경우까지 포함하여 a+1의 경우의 수가 생긴다.

마찬가지로 B, C에 대하여 b+1, c+1이 발생한다.

이 세 가지를 모두 곱하면 모든 경우의 수가 나오며, 세 가지 모두 선택하지 않은 경우를 제외하면 우리가 원하는 답이다.

따라서 대략적인 수식은 (a+1) * (b+1) * (c+1) - 1 이 된다.

옷의 종류에 따라 수식은 달라지기 때문에 위의 방식으로 루프를 돌며 구해주어야 할 것이다.

# 코드 작성

# 파라미터 clothes를 clothes_list로 바꿨다.
def solution(clothes_list):
	# 경우의 수를 구할 때 곱셈을 위해 1로 초기화한다.
    answer = 1
    
    # 1. 딕셔너리 생성
    type_count_dict = {}
    
    # 2. clothes_list를 순회하며 옷의 종류와 값을 저장한다.
    for clothes in clothes_list :
    	# 이름은 사실상 의미가 없다.
        clothes_name = clothes[0]
        clothes_type = clothes[1]
        
        if clothes_type not in type_count_dict :
            type_count_dict[clothes_type] = 0
            
        type_count_dict[clothes_type] += 1
        
    # 3. dict.keys()로 키 값(의상의 종류들)을 얻어온다.
    clothes_types = type_count_dict.keys()
       
    # 4. 경우의 수를 구한다.
    for clothes_type in clothes_types :
        answer = answer * (type_count_dict[clothes_type] + 1)
    
    # 경우의 수에 1을 빼 준다.(하나도 선택하지 않은 경우)
    answer -= 1
    
    # 5. 값을 반환한다.
    return answer

 

 * 본 문제의 출처는 프로그래머스(https://programmers.co.kr/) 입니다. 문제가 될 시 삭제하겠습니다.

반응형