프로그래머스 위장

문제

1

문제 출처 : 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);
}

댓글남기기