본문 바로가기
알고리즘/[ADV] 삼성 SW Expert Academy A형

SWEA 4013 : 특이한 자석 (모의 SW 역량테스트)

by 피로물든딸기 2021. 5. 5.
반응형

삼성 A형 전체 링크

 

모의 SW 역량테스트 문제집

 

특이한 자석 링크

 

이후 설명 및 입/출력은 링크 참고

 

풀이는 BOJ 14891 : 톱니바퀴 (삼성 SW TEST A형)를 참고하자. 

input 순서가 바뀌었고, 출력 방식만 다르다.

#include <stdio.h>

#define MAX (100 + 20)

int T;
int wheel[5][10];
int list[6];
int number[MAX];
int direct[MAX];
int N;

void input()
{
	scanf("%d", &N);
	for (int number = 1; number <= 4; number++)
	{
		for (int index = 1; index <= 8; index++)
		{
			scanf("%d", &wheel[number][index]);
		}
	}

	for (int i = 0; i < N; i++)
		scanf("%d %d", &number[i], &direct[i]);

	return;
}

void rotate(int number, int dir)
{
	int temp;

	if (dir == -1)
	{
		temp = wheel[number][1];
		for (int index = 1; index <= 7; index++)
		{
			wheel[number][index] = wheel[number][index + 1];
		}
		wheel[number][8] = temp;
	}
	else
	{
		temp = wheel[number][8];
		for (int index = 8; index >= 2; index--)
		{
			wheel[number][index] = wheel[number][index - 1];
		}
		wheel[number][1] = temp;
	}

	return;
}

int check(int compare, int number)
{

	if (compare < 1 || compare > 4) return 0;
	if (number < 1 || number > 4) return 0;

	if (compare < number && wheel[number][7] != wheel[compare][3]) return 1;
	if (compare > number && wheel[number][3] != wheel[compare][7]) return 1;

	return 0;
}

void DFS(int number, int dir)
{
	/* number를 기준으로 왼쪽 바퀴가 움직여야 하는지 체크 */
	if (check(number - 1, number) == 1 && list[number - 1] == 0)
	{
		list[number - 1] = dir * (-1);
		DFS(number - 1, dir * (-1));
	}

	/* number를 기준으로 오른쪽 바퀴가 움직여야 하는지 체크 */
	if (check(number + 1, number) == 1 && list[number + 1] == 0)
	{
		list[number + 1] = dir * (-1);
		DFS(number + 1, dir * (-1));
	}

	return;
}

int calculate()
{
	int sum, mul;

	sum = 0;
	mul = 1;
	for (int i = 1; i <= 4; i++)
	{
		sum += mul * wheel[i][1];
		mul *= 2;
	}

	return sum;
}

int main(void)
{
	scanf("%d", &T);

	for (int tc = 1; tc <= T; tc++)
	{
		int ans;

		input();

		for (int i = 0; i < N; i++)
		{
			list[number[i]] = direct[i];
			DFS(number[i], direct[i]);

			for (int k = 1; k <= 4; k++)
				if (list[k] != 0) rotate(k, list[k]);

			for (int k = 1; k <= 4; k++) list[k] = 0;
		}

		ans = calculate();

		printf("#%d %d\n", tc, ans);
	}

	return 0;
}
반응형

댓글