Study hard

(c++)프로그래머스 코딩테스트 연습 - 위장 본문

프로그래머스/해시

(c++)프로그래머스 코딩테스트 연습 - 위장

Nimgnoej 2020. 10. 22. 19:30

programmers.co.kr/learn/courses/30/lessons/42578

 

코딩테스트 연습 - 위장

 

programmers.co.kr

[풀이]

각각 종류마다 옷이 몇 가지씩 있는지 세고, 가능한 경우의 수를 구하는 문제였다.

옷 조합의 수 = (종류1의 옷 개수 + 1(안 입는 경우)) * (종류2의 옷 개수 + 1(안 입는 경우)) * ··· * (종류N의 옷 개수 + 1(안 입는 경우)) - 1(아무것도 안 입는 경우)

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

bool sortType(vector<string> &A, vector<string> &B) {
	return A[1] < B[1];
}

int solution(vector<vector<string>> clothes) {
	int answer = 1;
	vector<int>c;
	int tmp = 0;
	//같은 종류끼리 붙도록 정렬
	sort(clothes.begin(), clothes.end(), sortType);
	//옷 종류마다 몇가지 옷 있는지 저장
	for (int i = 0; i < clothes.size(); i++) {
		if (i != 0) {
			if (clothes[i][1] == clothes[i - 1][1])
				tmp++;
			else {
				c.push_back(tmp);
				tmp = 1;
			}
		}
		else
			tmp++;
	}
	c.push_back(tmp);
	int N = c.size();//종류 개수
	//(종류1의 옷 개수 + 1(안 입는 경우))*(종류2의 옷 개수 + 1(안 입는 경우))*...(종류N의 옷 개수 + 1(안 입는 경우))- 1(아무것도 안 입는 경우)
	for (int i = 0; i < N; i++) {
		answer *= (c[i] + 1);
	}
	answer -= 1;
	return answer;
}