[ C++ 백준 1101 ] 카드 정리 1

2024. 5. 10. 16:00알고리즘/백준 문제풀이

 

https://www.acmicpc.net/problem/1101

풀이

 

상자에 카드를 옮겨야하는 경우의 수를 체크해 조커 상자에 다 갖다 넣으면 된다.

하지만 조건 3번을 보면 같은 색을 가진 모든 카드는 모두 같은 박스에 있어야하기 때문에 이미 그 색의 카드를 정리한 상자가 있는 경우에는 옮겨야한다.

 

1. 상자가 비어있는 경우

2. 상자에 있는 카드의 색이 1종류만 있는 경우

+ 그 색의 카드를 정리한 상자가 없는 경우

를 제외하고 나머지 경우에는 옮겨주는 수를 센다.

 

이러한 방식으로

모든 박스가 조커 박스인 경우를 하나씩 계산하여 최소값을 구하면 된다.

 

 

개인적으로 어려웠던 부분

문제는 굉장히 쉬운데, 이해 과정에서 어려움을 겪었다.

0은 비어있는 것이고, 군데 군데 적혀있는 숫자들이 컬러값인 줄 알았는데,

알고보니 그 인덱스가 컬러값이고, 숫자는 카드 수였다.

 

왜 0을 입력하는 것인가 했는데, 이해를 잘못하고 있었다.

 

 

[ 코드 ]

#include <iostream>
#include <string.h>

using namespace std;

int Arr[50][50];
bool UsedColor[50];
int N, M;
int Answer;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	
	cin >> N >> M;
	Answer = 50;

	// Input
	for (int i = 0; i < N; ++i)
		for (int j = 0; j < M; ++j)
			cin >> Arr[i][j];

	// Solution
	for (int joker = 0; joker < N; ++joker)
	{
		memset(UsedColor, false, sizeof(UsedColor));
		int count = 0;

		for(int i = 0; i < N; ++i)
		{
			// Joker Not Check
			if (joker == i)
				continue;

			// Empty Check
			int check = 0, color = 0;
			for (int j = 0; j < M; j++)
			{
				if (Arr[i][j] != 0)
				{
					check++;
					color = j;
				}
			}

			if (check == 0)			// empty
			{
				continue;
			}
			else if (check == 1)	// one Color
			{

				if (UsedColor[color])
					count++;
				else
					UsedColor[color] = true;

			}
			else					// Many Color
			{
				count++;
			}

		}

		Answer = min(Answer, count);
		
	}

	cout << Answer;
}