알고리즘/백준-실버

백준 9375번 패션왕 신해빈(C++)

뜨거운 개발자 2022. 12. 30. 23:15

문제

정답 코드

#include <iostream>
#include <map>
#include <string>

using namespace std;

///필요한 건 숫자뿐.
map<string ,int> dic;

void	case_print()
{
	int	num;
	int result;

	num = 0;
	result =1;
	for (auto it : dic)
	{
		num = it.second;
		result *=(num + 1);
	}
	cout << result -1 << "\n";
}

int main()
{
	int c_n;
	cin >> c_n;
	for (int i=0; i < c_n;i++)
	{
		int	b;
		cin >> b;
		string cloth;
		string type;
		for (int j=0 ; j < b;j++)
		{
			cin >> cloth >> type;
			int num = dic[type];
			dic[type] = num + 1;
		}
		case_print();
		dic.clear();
	}
}

문제 풀이의 흐름

이 문제는 우선 우리가 필요한 자료는 옷의 종류와 갯수뿐이라는 걸 알면 map의 성질을 활용해서 쉽게 해결 할 수가 있다.

map의 성질이 key가 없으면 그곳에 key를 생성하고 value에 0을 넣어주는 걸 활용을 했다.

  1. 문제에서 캐이스 숫자들을 받아주고
  1. 옷과 옷의 타입을 받아주는데 옷은 아무런 작업도 하지 않고 그냥 입력만 받는다.
  1. map에 타입이 있다면 이전에 넣은 int값이 반환 처음 나오는 key값이라면 0을 반환하게 해준다. 하나 생겼기 때문에 1을 더해준다.
  1. 이후 case_print함수로 들어가는데 여기서 각 map을 순회하면서 타입마다 몇개의 옷이 있는지를 봐준다.
  1. 우리는 옷을 안 입는 경우까지 합쳐서 +1을 해준다
  1. 그렇게 모든 경우의 수를 곱하는데 이 경우의 수에는 옷을 아에 벗고 있는 경우가 포함되어서 -1을 해주게 되면 완성이다.

주의 할 점

이 코드는 map에 대해서 잘 알아야하고 clear를 잘 해줘야만 한다. 보통 전역변수로 하기 때문에 이전에 결과값을 가지고 있을 수 있다. 잘 생각해주다.

그외에는 map을 잘 공부하면 될 것 같다.

반성 및 고찰

이 문제는 이전에 풀었던 문제인데 dic이라는 자료형이 있는지 찾아봤었다. 생각해보면 그런건 없었고, map을 활용해서 풀수가 있었다.

하나의 key값에 여러개의 value를 가지는 자료형을 찾아봤는데 그런건 없었고 앞으로 그런게 필요하면 구조체로 만들어서 써야겠다고 생각했다. 코드 자체는 깔끔하게 짜서 map이 조금은 익숙해지고 있다고 느낀다.


Uploaded by N2T

728x90