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

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

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

 

A형 필수 알고리즘을 체계적으로 배우고 싶다면? (인프런 바로가기)

 

삼성 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;
}
반응형

댓글