[algorithm] 9375 패션왕 신혜빈

gunggme·2023년 11월 21일

알고리즘

목록 보기
14/42

시작

이 문제는 입력에서 함정이 있는데, 그 함정은 두개 동시 입력중에서 하나는 꼭 저장할 필요가 없다는 점이다. 그렇다면 저장을 해야되는 건 옷 이름이 아닌, 옷의 종류를 저장하고, 그 값을 구해야 하는데, 한번 알고리즘을 짜보자.

알고리즘

  1. map으로 string과 int의 맵을 생성
  2. map에 옷의 종류의 value를 +1 하기
  3. 그리고 map의 각 value값을 +1한 값을 곱하기
  4. 출력은 -1을 해야됨(알몸일 순 없음)

알고리즘을 한번 짜봤는데, 왜 곱하는지와, +1을 해야되는지도 이해를 못할 수 있을거다. 그 답을 얻기 위해선 경우의 수를 알아야되는데, 예제 입력에서 첫번째 문제 입력을 한번 봐보자.
headgear는 2개 eyewear은 1개, 여기서 아무것도 안입을 수 있으니, 3개 2개다. 그렇다면 이제 이 두개를 곱하면 되는데, 곱하면 6이 나오는걸 알 수 있다. 하지만? 알몸일 수는 없다는 조건이 있어서, -1을 해주면 정답인 5가 나온다.

코드

#include<iostream>
#include<vector>
#include<string>
#include<map>
#include<algorithm>

using namespace std;

int main() {
	int n, m;
	long long int sum;
	cin >> n;
	for (int i = 0; i < n; i++) {
		// 곱해야 하니 1로 초기화
		sum = 1;
		// 입력 받은 공간
		map<string, int> _map;
		cin >> m;
		for (int j = 0; j < m; j++) {
			string a, b;
			cin >> a >> b;
			// a b일때 b index의 값 +1
			_map[b]++;
		}
		for (auto c : _map) {
			// 경우의 수를 생각해 +1를 하고 곱하기
			sum *= ((long long)c.second + 1);
		}
		// 알몸일 수는 없으니 -1
		cout << sum-1 << "\n";
	}
}
profile
안녕하세요!

0개의 댓글