본문 바로가기

삼성 SW 역량 테스트 기출문제

[C++] 삼성 SW 역량 테스트 기출문제 백준 14891번 - 톱니바퀴

 

 

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

 

14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터

www.acmicpc.net

 

 

 

#include <bits/stdc++.h>
// 삼성 SW 역량 테스트 기출문제  [C++] 백준


std::string temp[4];
std::string wheels[4];
bool visit[4];
int k;


void rotate(int curr, int dir){
	char ch;
	if (dir == 1){
		ch = temp[curr][7];
		for (int i = 7; i >= 1; --i){
			temp[curr][i] = temp[curr][i - 1];
		}
		temp[curr][0] = ch;
	}
	else {
		ch = temp[curr][0];
		for (int i = 1; i < 8; ++i){
			temp[curr][i - 1] = temp[curr][i];
		}
		temp[curr][7] = ch;
	}
}


void move(int curr, int dir){
	rotate(curr, dir);
	if (curr - 1 >= 0 && !visit[curr - 1] && wheels[curr][6] != wheels[curr - 1][2]){
		visit[curr - 1] = true;
		move(curr - 1, -dir);
	}
	if (curr + 1 < 4 && !visit[curr + 1] && wheels[curr][2] != wheels[curr + 1][6]){
		visit[curr + 1] = true;
		move(curr + 1, -dir);	
	}
}


int main()
{
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
	for (int i = 0; i < 4; ++i){
		std::cin >> wheels[i];
	}

	std::cin >> k;
	int num, dir;

	for (int i = 0; i < 4; ++i){
		temp[i] = wheels[i];
	}

	while(k--){
		std::cin >> num >> dir;
		visit[num - 1] = true;
		move(num - 1, dir);
		std::fill(visit, visit + 4, false);
		for (int i = 0; i < 4; ++i){
			wheels[i] = temp[i];
		}
	}

	int ret = 0;
	int value = 1;

	for (int i = 0; i < 4; ++i){
		if (wheels[i][0] == '1'){
			ret += value;
		}
		value <<= 1;
	}
	std::cout << ret << '\n';
	return 0;
}