본문 바로가기
알고리즘/프로그래머스 PS

[프로그래머스][Level 2][Python] 위장

by 빛밤하늘 2021. 7. 30.
반응형

밑의 링크는 프로그래머스에서의 문제 링크입니다.

 

코딩테스트 연습 - 위장

 

programmers.co.kr

 

 

 

 

 

 

 

 

주의해야 할 

스파이는 하루에 최소 한 개의 의상은 입는다는 것을 주의해야 합니다.

특히 저처럼 수학적으로 풀 때 주의해야 합니다.

 

 

 

생각한 풀이 과정

문제의 입출력 예제의 설명처럼 구현한 코드가 아닌, 수학적 접근으로 푼 방법입니다.

 

  1. 매개변수 clothes의 값에는 각 옷들이 종류마다 묶여서 저장되어 있지 않기 때문에, 옷의 종류를 key로, 옷의 이름을 value로 지정한 딕셔너리 변수로 구별해서 다시 만들어줍니다.
  2. 옷의 한 종류에는 여러 옷들이 있을 수 있기 때문에 딕셔너리의 value는 리스트 형태로 만들어줍니다.
  3. 옷의 종류마다 (각 옷의 종류에서 옷의 개수) + (이 옷의 종류를 입지 않는 경우를 생각한 1)의 값을 구합니다.
  4. 3에서 구한 모든 값을 곱하면 (스파이가 서로 다른 옷을 입는 조합의 수)와 (스파이가 옷을 하나도 입지 않은 경우인 1)을 더한 값이 나옵니다.
  5. 스파이는 적어도 옷을 하나는 입으므로 4에서 구한 값에서 1을 뺍니다. 이 값이 스파이가 서로 다른 옷을 입는 조합의 수입니다.

 

 

 

 

 

 

 

 

제출한 파이썬 코드

# 스파이가 가진 의상들이 담긴 2차원 리스트 clothes가 매개변수로 주어집니다.
def solution(clothes):
    # 서로 다른 옷의 조합의 수를 저장할 변수를 선언합니다.
    # 처음에는 1로 초기화합니다.
    cloth_comb_cnt = 1
    # 스파이가 가진 의상들을 의상의 종류로 구분해서 저장하기 위한 딕셔너리 변수를 선언합니다.
    clothes_class = {}

    # clothes에서 옷의 정보를 하나씩 반복해봅니다.
    for cloth in clothes:
        # 현재 옷의 정보에서 옷의 이름을 저장하는 변수를 선언합니다.
        cloth_name = cloth[0]
        # 현재 옷의 정보에서 옷의 종류를 저장하는 변수를 선언합니다.
        cloth_type = cloth[1]

        # 현재 옷의 종류가 한 번도 등장하지 않았던 종류라면
        if cloth_type not in clothes_class.keys():
            # 옷의 종류를 키로, 옷의 이름을 리스트 변수에 넣은 형태의 값으로 clothes_class에  저장합니다.
            clothes_class[cloth_type] = [cloth_name]
        # 현재 옷의 종류가 이전에 한 번 등장했던 종류라면
        elif cloth_type in clothes_class.keys():
            # clothes_class에서 종류에 해당하는 키를 찾고 그 값인 리스트에 현재 옷의 이름을 넣어줍니다.
            clothes_class[cloth_type].append(cloth_name)

    # 옷의 종류들이 담긴 리스트를 저장하는 변수를 선언합니다.
    cloth_types = clothes_class.keys()

    # 옷의 종류들에서 한 종류씩 반복해봅니다.
    for cloth_type in cloth_types:
        # 현재 옷의 종류에서 옷의 개수에 1을 더한 값을 저장하는 변수를 선언합니다.
        # 1을 더한 이유는 옷을 입지 않은 경우를 고려한 것입니다.
        type_length = len(clothes_class[cloth_type]) + 1
        # cloth_comb_cnt에 type_length를 곱해줍니다.
        cloth_comb_cnt *= type_length

    # 스파이는 최소 한 개의 의상은 입으므로 의상을 하나도 입지 않은 경우는 빼줘야합니다. 
    # cloth_comb_cnt에 1을 뺀 값을 반환합니다.
    return cloth_comb_cnt - 1

 

 

 

제출 결과

결과

 

 

 

 

 

 

 

 

느낀 점

저는 문제에서처럼 옷의 종류에서 하나씩 하나씩 뽑아서 조합의 수를 찾지는 않았습니다.

처음에 수학적인 계산으로 풀릴 것 같아서 생각만 하고,

그래도 문제의 입출력 예제의 설명처럼 구현하기 위해 combinations를 사용했었습니다.

하지만 자꾸 테스트 1만 통과하지 못하고 시간을 줄이는 방법을 찾지 못했습니다.

 

결국 처음에 생각했던 수학적 접근으로 풀게 되었습니다.

 

다른 사람들의 코드 중에 combinations를 사용해서 푼 코드를 찾아서 공부해봐야겠습니다.

 

 

 

※ 궁금한 부분, 이상한 점 및 오타는 댓글에 부탁드립니다.

※ 더 효율적이고 빠른 정답을 환영합니다.

반응형

댓글