본문 바로가기

Algorithm

4013. [모의 SW 역량테스트] 특이한 자석

반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWIeV9sKkcoDFAVH&categoryId=AWIeV9sKkcoDFAVH&categoryType=CODE

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

전에 풀어본 유형.

다만 이웃 톱니 영향은 회전 이전에 체크해야 함.

 

#include<iostream>
#include<vector>


using namespace std;

vector<pair<int, int> > vec;
vector<pair<int, int> > r;
int K;
int arr[5][9];

int cal()
{
	int count = 0;

	if (arr[1][1])
	{
		count += 1;
	}

	if (arr[2][1])
	{
		count += 2;
	}

	if (arr[3][1])
	{
		count += 4;
	}

	if (arr[4][1])
	{
		count += 8;
	}

	return count;
	
}

void tok(int idx, int dir)
{
	int temp[9];
	for (int i = 1; i <= 8; i++)
	{
		temp[i] = arr[idx][i];
	}

	if (dir == 1)
	{
		for (int i = 2; i <= 8; i++)
		{
			arr[idx][i] = temp[i - 1];
		}
		arr[idx][1] = temp[8];
	}
	else
	{
		for (int i = 7; i >= 1; i--)
		{
			arr[idx][i] = temp[i + 1];
		}
		arr[idx][8] = temp[1];

	}

}



void move()
{
	for (int i = 0; i < vec.size(); i++)
	{
		int idx = vec[i].first;
		int dir = vec[i].second;
		r.clear();
		r.push_back({ idx,dir });
		
		if (idx == 1)
		{
			if (arr[1][3] != arr[2][7])
			{
				r.push_back({ 2,-dir });
				if (arr[2][3] != arr[3][7])
				{
					r.push_back({ 3,dir });
					if (arr[3][3] != arr[4][7])
					{
						r.push_back({ 4,-dir });
					}
				}

			}
		}
		else if (idx == 2)
		{
			if (arr[1][3] != arr[2][7])
			{
				r.push_back({ 1,-dir });
			}

			if (arr[2][3] != arr[3][7])
			{
				r.push_back({ 3,-dir });
				if (arr[3][3] != arr[4][7])
				{
					r.push_back({ 4,dir });
				}
			}
		}
		else if (idx == 3)
		{
			if (arr[3][3] != arr[4][7])
			{
				r.push_back({ 4,-dir });
			}

			if (arr[3][7] != arr[2][3])
			{
				r.push_back({ 2,-dir });
				if (arr[2][7] != arr[1][3])
				{
					r.push_back({ 1,dir });
				}
			}
		}
		else if (idx == 4)
		{
			if (arr[4][7] != arr[3][3])
			{
				r.push_back({ 3,-dir });
				if (arr[3][7] != arr[2][3])
				{
					r.push_back({ 2,dir });
					if (arr[2][7] != arr[1][3])
					{
						r.push_back({ 1,-dir });
					}
				}

			}

		}

		for (int j = 0; j < r.size(); j++)
		{
			tok(r[j].first, r[j].second);
		}
	}

}

int main(int argc, char** argv)
{
	int test_case;
	int T;

	std::cin >> T;
	/*
	   여러 개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
	*/
	for (test_case = 1; test_case <= T; ++test_case)
	{
		std::cin >> K;
		vec.clear();
		for (int i = 1; i <= 4; i++)
		{
			for (int j = 1; j <= 8; j++)
			{
				std::cin >> arr[i][j];
			}
		}

		for (int i = 0; i < K; i++)
		{
			int a, b;
			std::cin >> a;
			std::cin >> b;
			vec.push_back({ a,b });
		}

		move();
		std::cout << "#" << test_case << " " << cal() << endl;
	}
	return 0;//정상종료시 반드시 0을 리턴해야합니다.
}
반응형