본문 바로가기
알고리즘/[ADV] 삼성 SW 역량 테스트 A형

[코드트리] 돌아가는 팔각의자 (삼성 SW 역량테스트 2017 하반기 오후 1번)

by 피로물든딸기 2024. 6. 7.
반응형

삼성 A형 전체 링크

 

https://www.codetree.ai/training-field/frequent-problems/problems/rounding-eight-angle

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

 

돌아가는 팔각의자 문제 풀이BOJ 14891 : 톱니바퀴와 같다.

#include <stdio.h>

#define MAX (100 + 20)

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

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

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

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;
	}
}

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));
	}
}

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);
	T = 1;
	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\n", ans);
	}

	return 0;
}
반응형

댓글