문제 : 위장
사용언어 : C#
문제 내용
문제 설명
스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.
예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.
종류 | 이름 |
얼굴 | 동그란 안경, 검정 선글라스 |
상의 | 파란색 티셔츠 |
하의 | 청바지 |
겉옷 | 긴 코트 |
스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.
제한사항
- clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
- 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다.
- 같은 이름을 가진 의상은 존재하지 않습니다.
- clothes의 모든 원소는 문자열로 이루어져 있습니다.
- 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.
- 스파이는 하루에 최소 한 개의 의상은 입습니다.
입출력 예
clothes | return |
[["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]] | 5 |
[["crow_mask", "face"], ["blue_sunglasses", "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
내 풀이
key - value 세트인 Dictionary를 이용했다.
우선 문제에서 아이템, 종류를 받아오는데, 아이템수가 필요했으므로
종류를 key값으로 하고, 아이템수를 value로 했다.
Dictionary는 중복 key를 허용하지 않는다.
받아온 정보들로 내가 Dictionary를 만들 땐, key값 중복체크를 해주고,
이미 있는 key값(아이템종류)라면 +1을 해줬다.
계산해야 하는 값은 아이템을 하나이상 사용해서, 몇 개의 조합을 만들 수 있는지를 구하려면
조합 수학 공식을 이용해야 한다.
nCr : n개 중에서 r개를 뽑아 나열할 수 있는 경우의 수
아이템종류가 두 가지라면,
n1C1 * n1C0 * n2C1 * n2C0 ... 이런 식으로 다 곱한 다음 아무것도 안 입는 경우의 수 1만 빼주면 된다
nCr = nPr/r! = n * (n-1) * (n-2) * ... * (n-r+1) / r * (r-1) * (r-2) * ... * 1
private static Dictionary<string, int> checkClothes;
public static int solution(string[,] clothes)
{
int answer = 1;
checkClothes = new Dictionary<string, int>();
for (int i = 0; i < clothes.GetLength(0); ++i)
{
string itemType = clothes[i, 1];
if (checkClothes.ContainsKey(itemType))
{
checkClothes[itemType] += 1;
}
else
{
checkClothes.Add(itemType, 1);
}
}
foreach (var item in checkClothes)
{
answer *= (item.Value + 1);
}
answer -= 1;
return answer;
}
Dictionary
- System.Collections.Generic클래스
- Key라고 불리는 인덱스 번호를 대신해 사용하는 명칭과 Value라고 불리는 값을 세트로 다룬다
- 연관배열을 다루기 위한 클래스 ( key-value 세트로 다루는 배열을 연관배열이라고 한다 )
- 중복된 key를 사용할 수 없다
List와의 차이점
- list는 인덱스 번호를 사용하여 요소의 값을 얻고, dictionary는 key값을 사용하여 값을 얻는다
- dictionary는 숫자 이외의 문자열 등을 키로 지정하여 세트의 값을 얻을 수 있다
생성
Dictionary<TKey,TValue> ObjectName = new Dictionary<TKey,TValue>();
요소 추가 / Add() 함수 이용
public void Add( TKey key, TValue value )
검색 / ContainsKey(), ContainsValue() 함수 이용
public bool ContainsKey( TKey key )
'프로그래머스' 카테고리의 다른 글
[프로그래머스] [C++] 연습문제 > 최솟값 만들기 (1) | 2023.05.08 |
---|---|
[프로그래머스] [C++] 해시 > 완주하지 못한 선수 (0) | 2023.04.04 |
[프로그래머스] [C#] 연습문제 > 자연수 뒤집어 배열로 만들기 (0) | 2023.03.30 |
[프로그래머스] [C#] 정렬 > K번째수 (0) | 2023.03.28 |
[프로그래머스] [C#] 스택/큐 > 기능개발 (0) | 2023.03.28 |