프로그래밍언어/알고리즘

알고리즘 7편 Hash 난이도2 key value 위장 의상경우의수 코틀린(kotlin) 으로 시작하는 문제해결방법

by 앵과장 2021. 9. 21. 16:29
반응형

안녕하세요

앵과장입니다.

 

오늘은 프로그래머스 Hash 난이도 2 위장 코딩해보도록 하겠습니다.

프로그래머스에서 3번째 문제이며 1번 2번을 풀어보셨다면 3번째도 풀어볼 수 있을만한 난이도입니다.

 

그럼 지금 시작하도록 하겠습니다.

 

package com.programmers.problem

/**
 * 문제 설명
BJ들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.

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

종류	이름
얼굴	동그란 안경, 검정 선글라스
상의	파란색 티셔츠
하의	청바지
겉옷	긴 코트
스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.

제한사항
clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
BJ가 가진 의상의 수는 1개 이상 30개 이하입니다.
같은 이름을 가진 의상은 존재하지 않습니다.
clothes의 모든 원소는 문자열로 이루어져 있습니다.
모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.
BJ는 하루에 최소 한 개의 의상은 입습니다.
입출력 예
clothes	return
[["yellowhat", "headgear"], ["bluesunglasses", "eyewear"], ["green_turban", "headgear"]]	5
[["crowmask", "face"], ["bluesunglasses", "face"], ["smoky_makeup", "face"]]	3
입출력 예 설명
예제 #1
headgear에 해당하는 의상이 yellow_hat, green_turban이고 eyewear에 해당하는 의상이 blue_sunglasses이므로 아래와 같이 5개의 조합이 가능합니다.

1. yellow_hat
2. blue_sunglasses
3. green_turban
4. yellow_hat + blue_sunglasses
5. green_turban + blue_sunglasses
예제 #2
face에 해당하는 의상이 crow_mask, blue_sunglasses, smoky_makeup이므로 아래와 같이 3개의 조합이 가능합니다.

1. crow_mask
2. blue_sunglasses
3. smoky_makeup

 */
class Hash03 {
    fun solution(clothes: Array<Array<String>>): Int {
        var answer = 0
    
        return answer
    }
}

항상 코딩 테스트는 질문이 난해합니다.

원하는 게 의상 조합의 수를 가져오랍니다.

그래 이 정도면 쉬운 거긴 합니다...

 

스파이는 한 개 이상 무조건 입고 

[C, 팬티],[T,팬티],[시스루,상의],[PINK,모자]

배열 2개 중 

index 0 == value

index 1 == key

고됩니다. 

 

그리고 같은 Key가 나올 수 있습니다.

그럼 여기서 "getOrDefault" 을 사용하면 되겠죠

기존 map 키가 있다면  value를 반환한다.로 

중복일 때 기존 값에 +1을 해줘서 

 

의상을 입을 수 있는 경우의 수를 계산해야 합니다.

 

 fun solution(clothes: Array<Array<String>>): Int {
        var answer = 1
        val clothHash = HashMap<String, Int>()
        for (i in clothes.indices){
            var item = clothes.get(i)
            clothHash.put(
                item.get(1)
                ,clothHash.getOrDefault(item.get(1),0) + 1
            )
        }

        for(keyValue in clothHash) {
            answer *= (keyValue.value + 1)
        }

        answer--
        return answer
    }

 

먼저 hashMap <String, Int> 선언합니다.

val clothHash = HashMap<String, Int>()

 

2차원 배열을 돌려봅니다.

for (i in clothes.indices){  
  var item = clothes.get(i) 배열 1개를 꺼내고


  clothHash.put(
  item.get(1)   //Map 에 key에는 index1 
  ,clothHash.getOrDefault(item.get(1),0) + 1.  // value에는 map index 0번째를 하지만 우리는 경우 숫자만 하면 되니 1을 넣게 되는데 기존 동일한 Key map이 있다면 +1 을해줍니다.
  )
}

 

그다음 다시 map을 for문으로 돌려서

answer *= (keyValue.value + 1) 배열에 값 그리고 +map 숫자 

곱하기를 한 뒤

answer -- 빼줍니다. 

그러면 원하는 값이 나옵니다.

 

 

다음 알고리즘 클릭클릭

 

알고리즘 8편 Hash 난이도3 베스트앨범 lamda 함수형 코틀린(kotlin) 으로 시작하는 문제해결방법

안녕하세요 앵과장입니다. 베스트앨범 Hash 난이도3 문제 설명 스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분

angryfullstack.tistory.com