비트를 쪼개는 개발자

allen321@naver.com

코딩테스트

C# [프로그래머스] Lv.2 의상

MozarTnT 2024. 8. 27. 15:46
728x90
반응형

 

 

 

 

 

 

 

문제 설명

 

1. yellow_hat
2. blue_sunglasses
3. green_turban
4. yellow_hat + blue_sunglasses
5. green_turban + blue_sunglasses

 

각 입을 수 있는 의상들을 종류별로 입는 경우의 수를 모두 계산하고 최종적으로 몇개의 조합으로 옷을 입을 수 있는지 계산하는 문제이다.

 

우선 각 의상의 종류별로 몇개의 종류가 있는지 넣어줄 딕셔너리를 선언하고 string 배열에서 받아온 옷의 갯수 만큼 계산하는 for문을 돌려준다.

 

이후에는 각 Dictionary 의 key값 만큼 곱해주면 간단하게 경우의 수가 나온다.

최소한 하나의 옷은 입는다는 전제조건이 있었기 때문에 최종적으로 나온 answer에 -1을 해주면 해결 된다.

 

 

 

해당 코드

 

 

using System;
using System.Collections.Generic;

public class Solution 
{
    public int solution(string[,] clothes) 
    {
        // 의상 종류별로 몇 개의 의상이 있는지 저장할 딕셔너리
        Dictionary<string, int> clothesDict = new Dictionary<string, int>();
        
        // 각 의상의 종류를 세어준다.
        // clothes 배열의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있다.
        for (int i = 0; i < clothes.GetLength(0); i++) 
        {
            string category = clothes[i, 1]; // 의상의 종류를 가져옴
            
            // 만약 해당 종류가 이미 딕셔너리에 있다면, 그 값을 1 증가시킴
            if (clothesDict.ContainsKey(category)) 
            {
                clothesDict[category]++;
            } 
            // 딕셔너리에 해당 종류가 없다면, 새로운 종류로 추가하고 값을 1로 설정
            else 
            {
                clothesDict[category] = 1;
            }
        }
        
        // 가능한 모든 조합의 수를 계산
        int answer = 1; // 곱셈을 위한 초기값을 1로 설정 (곱셈의 항등원)
        
        // 딕셔너리의 키(의상 종류)를 리스트로 변환하여 for 루프로 순회
        List<string> keys = new List<string>(clothesDict.Keys);
        
        // 각 의상 종류별로 (해당 종류의 의상 수 + 1)을 계산하여 곱함
        // +1을 하는 이유는 해당 종류의 의상을 입지 않는 경우를 포함하기 위해서
        for (int i = 0; i < keys.Count; i++) {
            string key = keys[i];
            answer *= (clothesDict[key] + 1); // 해당 종류의 의상 수 + 1 (입지 않는 경우 포함)
        }
        
        // 아무것도 입지 않은 경우(즉, 모든 의상을 입지 않은 경우)는 제외해야 하므로 -1을 해줌
        return answer - 1;
    }
}

 

 

 

 

728x90
반응형