본문 바로가기
코딩테스트/코딩테스트 문제

코딩테스트 준비 - 프로그래머스 위장 풀이/파이썬 딕셔너리를 이용한 문제 풀이 (파이썬)

by 공부가싫다가도좋아 2021. 7. 5.
반응형

프로그래머스 위장 풀이


문제 풀러 가기

https://programmers.co.kr/learn/courses/30/lessons/42578?language=python3 

 

코딩테스트 연습 - 위장

 

programmers.co.kr


문제 분석

1. 경우의 수를 이용한 풀이


코드

def solution(clothes):
    dic={}
    cnt=1
    for i in clothes:
        key = i[1]
        value = i[0]
        if key not in dic:
            dic[key]=[value]
        else:
            dic[key].append(value)

    for i in dic.keys():
        cnt=cnt*(len(dic[i])+1)
    return cnt-1

코드 풀이

def solution(clothes):
    dic={}
    cnt=1
    for i in clothes:
        key = i[1]
        value = i[0]
        if key not in dic: 
            dic[key]=[value]
        else: #같은 종류의 의상이면, 그 key의 value리스트에 추가하기
            dic[key].append(value)

    for i in dic.keys():
        cnt=cnt*(len(dic[i])+1)  
        # 모든 경우의수 + 해당 종류의 의상을 안입었을때의 경우의수
        # 자세한 풀이는 아래 확인해주세요
    return cnt-1
    # (모든 경우의수 + 해당 종류의 의상을 안입었을때의 경우의수)- (모두 착용하지 않았을때 경우의 수)

 

경우의 수 계산법: (2가지 계산법)

<첫 번째 계산법>

예를 들어 이런 리스트가 있다면, [["yellowhat", "headgear"], ["bluesunglasses", "eyewear"], ["green_turban", "headgear"]]

딕셔너리로 이렇게 정리해준다.

{'headgear': ['yellow_hat', 'green_turban'],  'eyewear': ['blue_sunglasses']}

 

여기서 총경우의 수는, ((yellow_hat을 썼을 때 + green_turban을 썼을 때) +headgear 안 썼을 때) * ((blue_sunglasses 썼을 때)+  eyewear 안 썼을 때) = 3*2 = 6

이건 총경우의 수이고, 여기서 모두 착용하지 않았을 때의 경우의 수 하나를 빼면 6-1 = 5가 됩니다.

 

<두 번째 계산법>

혹은, 애초에 모두 착용하지 않은 경우의 수를 빼서 계산하는 법도 있습니다. 

yellow_hat만 썼을 때 경우의 수 1 + green_turban만 썼을때 경우의 수 1 + blue_sunglasses만 썼을때 경우의 수 1 =3

 

headgear 1개, eyewear1개씩 썼을 때의 경우의 수는 2*1 = 2

=> 여기서 2와 1은 headegear와 eyewear에 있는 value의 개수.

3+2 = 5 가 됩니다.

 

하지만 두 번째 방법으로 계산한다면, 코드가 조금 더 복잡해지기 때문에 첫 번째 계산방식을 이용하는 것이 좋습니다. 


<잡담&배운 점>

1. 딕셔너리의 value에 리스트를 사용할 수 있다.

 

오늘은 사실 간단한 문제였지만, 경우의 수를 생각해 내지 못했다면 어려웠을 문제입니다. 

저는 처음에 아래 방식을 이용하여 경우의 수를 계산해서 조금 더 비효율적인 코드를 짰네요 ㅠ_ㅠ

반응형

댓글