프로그래머스 위장
문제
문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/42578
풀이
같은 이름의 의상은 존재하지 않기 때문에 종류의 갯수를 파악하고 종류별로 +1(고르지않은 경우의 수) 시킨 값을 곱해준다음 1(하나도 고르지않은 경우의 수)을 빼면 조합의 수가 나오게된다.
예를들면 상의 3개 하의 2개를 가지고있을 때 각각 1을 더한 4,3를 곱하고 1을 뺀 11이라는 조합의 수가 나오게된다.
종류의 수를 구할 때 종류만 저장하는 배열을 따로 만든다음 중복값을 제거한다음다시 원래의 배열에서 해당되는 값을 찾아 카운트한다음 int
형 배열에 종류의 갯수를 저장했다.
그리고 이 종류 배열을 이용하여 종류별로 조합시킨 값을 저장하거나 종류가 1가지뿐이라면 경우의 수가 1가지 종류의 옷가지수만 저장하고 리턴시켰다.
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int solution(vector<vector<string>> clothes)
{
int answer = 0;
int size = clothes.size();
int multi=0;
vector<string> type;
vector<int> num;
for (int i = 0; i < size; i++) // 종류만 배열에 추가
{
type.push_back(clothes[i][1]);
}
sort(type.begin(), type.end());
type.erase(unique(type.begin(), type.end()),type.end()); // 종류 중복 제거
for (int i = 0; i < type.size(); i++)
{
int sum = 0;
for (int j = 0; j < size; j++)
{
if (type[i] == clothes[j][1])
{
sum++;
}
}
num.push_back(sum); // 종류별 갯수 배열에 추가
}
if (num.size() != 1) // 한종류가 아닐시
{
multi = num[0]+1;
for (int i = 1; i < num.size(); i++) // 각 종류 갯수+1로 곱한 값 저장
{
multi *= num[i]+1;
}
answer = multi-1; // 아무것도 안고른값 1가지를 빼고 answer에 저장
}
else // 한종류 일시 갯수만큼 저장
{
answer = num[0];
}
return answer;
}
int main()
{
vector<vector<string>> clo;
vector<string> s;
s.push_back("hat1");
s.push_back("head");
vector<string> d;
d.push_back("hat2");
d.push_back("head");
vector<string> f;
f.push_back("hat3");
f.push_back("head");
vector<string> g;
g.push_back("pant1");
g.push_back("pant");
vector<string> h;
h.push_back("pant2");
h.push_back("pant");
clo.push_back(s);
clo.push_back(d);
clo.push_back(f);
clo.push_back(g);
clo.push_back(h);
cout << solution(clo);
}
댓글남기기