코딩테스트 고득점 Kit - 해시 문제


✔️ 문제 설명

스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.

예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.

종류 이름
얼굴 동그란 안경, 검정 선글라스
상의 파란색 티셔츠
하의 청바지
겉옷 긴 코트

스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.

제한사항

  • clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
  • 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다.
  • 같은 이름을 가진 의상은 존재하지 않습니다.
  • clothes의 모든 원소는 문자열로 이루어져 있습니다.
  • 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 ‘_’ 로만 이루어져 있습니다.
  • 스파이는 하루에 최소 한 개의 의상은 입습니다.
  • 👉 문제 보러가기


✔️ 문제 풀이

(1) Pseudo-Code

- 의상 종류가 다 같으면 조합할 수 있는 수는 스파이가 가진 의상 수 이다.

1. clothes 에 있는 모든 리스트 중 [1]번 인덱스에 있는 값들을 가져와 새로운 리스트로 만든다. (type_clothes)
2. type_clothes 를 set (집합 자료형) 을 통해 중복 제거하여 종류의 개수를 변수 (type_num) 에 할당한다.
3. 만약, type_num 이 1이라면 len(clothes)을 정답값으로 반환한다.
4. 만약, type_num 이 1이 아니라면 !
5. type_clothes 에 의상 종류 값을 새로운 딕셔너리의 key 값으로 만들고, value는 0으로 설정해 둔다.
6. clothes 에 있는 요소들 중 의상의 종류가 dict의 키 값과 같으면 해당 value의 값에 +1 처리해 준다.
7. 마지막으로, type_num 만큼 반복문을 돌리고 조합이 가능한 경우의 수를 구한다.
예) 얼굴 - 2개, 의상 - 3개 => 한 개씩 착용 = 5, 두 개씩 착용 : 2*3 = 6 ==> 총 11가지의 경우의 수
적용) 얼굴 -2개, 의상 - 3개 => (2+1)*(3+1)-1 = 11개 (착용하는 경우와 착용하지 않는 경우)

(2) 코드 작성

def solution(clothes):
    answer = 1
    
    # 의상 종류의 개수 가져오기
    type_clothes = [x[1] for x in clothes]
    type_num = len(set(type_clothes))

    # 의상 종류를 key값으로, 종류에 대한 값을 values로 가져오기
    dict_clothes = {}
    
    # 만약, 의상 종류가 1개라면 clothes 길이를 반환하기
    if type_num == 1:
        return len(clothes)
    else:
        # 딕셔너리의 키값 저장하고, 개수를 0으로 임의 설정하기
        for i in type_clothes:
            dict_clothes[i] = 0   
        # clothes 의 의상종류가 딕셔너리의 키값과 같다면 개수를 늘리기
        for c in clothes:
            dict_clothes[c[1]] += 1
        # 의상 종류별 개수에 대해 경우의 수 만들기
        for val in dict_clothes.values():
            answer *= val + 1
            
        return answer-1

(3) 코드 결과

  • 성능 요약 : 메모리 10.2 MB, 시간 0.01 ms
  • 채점결과 : 정확성 100.0, 합계 100.0/100.0

(4) 코드 리뷰

  • 우선, 의상 종류가 여러 개 올 수 있기 때문에 set을 사용하여 중복을 제거해 주었다.
  • 의상 종류별 개수를 지정하기 위해 dictionary를 사용하였다.
  • 하지만 딕셔너리를 만드는 과정에서 for문을 너무 많이 사용하여 코드가 너무 길어진 것 같다.
  • 이때 type_clothes 에서 list comprehension을 사용한 것을 dictionary에도 적용하면 코드를 줄일 수 있을 것이다.


👩🏻‍💻개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다.

댓글남기기