14891 톱니바퀴

최성현·2021년 3월 27일
0

삼성SW역량테스트

목록 보기
7/12

톱니바퀴 문제링크

코드 설명

vector<deque< int>> 를 이용하여 gear입력을 받았다.
deque를 쓴 이유는 회전하는 각각의 톱니를 1차원 큐로 생각하여 회전시 각각의 앞과 뒤에 추가하거나 빼는과정을 하기위해서이다. 즉, 3시방향은 2번index 9시방향은 6번 index가 된다.

✌ 2가지 함수를 사용하였다.
1.dfs() 는 각 톱니가 움직일때 연쇄적으로 움직이는 좌우 톱니의 방향(ratate[]) 배열에 정보를 저장하는 역할
2.gear_turn() 은 dfs를 통해 얻어진 배열을 통해 4개의 톱니 정보에 맞게 회전시킨다.

처음에는 dfs()함수내에 gear_turn()을 넣어서 한번에 수행하려했는데 그렇게하면 이미 기어가 돌아간 상황이므로 연쇄적으로 좌,우 기어가 의도대로 돌아가지않는 예외가 생긴다.

**🤦‍♂️각 기어의 상태를 저장하는 rotate배열을 만들자는 생각하자!!!

코드

#include<iostream>
#include<deque>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
vector<deque<int> > gear(5);
int k;
int rotate_gear[5];
bool check[5];
int total_score() {
	int cnt = 0;
	for (int i = 1; i < 5; i++) {
		if (gear[i][0] == 1) {
			if (i == 1) cnt++;
			else if (i == 2) cnt += 2;
			else if (i == 3) cnt += 4;
			else cnt += 8;
		}

	}
	return cnt;
}
void gear_turn() {
	//기어 4개 회전
	for (int i = 1; i <= 4; i++) {
		if (rotate_gear[i] == 0) { //회전안함
			continue;
		}
		else if (rotate_gear[i] == 1) { //시계방향
			int temp = gear[i].back();
			gear[i].pop_back();
			gear[i].push_front(temp);
		}
		else { //반시계
			int temp = gear[i].front();
			gear[i].pop_front();
			gear[i].push_back(temp);
		}
	

	}
	

}
void dfs(int num,int dir) { // 하나가 움직이면 양옆 연쇄적으로 돌아가야함-> dfs 활용
	rotate_gear[num] = dir;//얻은 정보를 통해 rotate()진행할것
	check[num] = true;

	if (!check[num-1] && num - 1 >= 1) {
		if (dir == 0) {
			dfs(num - 1, 0);
		}
		if (gear[num][6] != gear[num - 1][2]) {
			dfs(num - 1, -dir);
		}
		else if (gear[num][6] == gear[num - 1][2]) {
			dfs(num - 1, 0);
		}

	}
	if (!check[num + 1] && num < 4) {
		if (dir == 0) {
			dfs(num + 1, 0);
		}
		if (gear[num][2] != gear[num + 1][6]) {
			dfs(num + 1, -dir);
		}
		else {
			dfs(num + 1, 0);
		}


	}

}
int main() {
	for (int j = 1; j < 5; j++) {
		for (int i = 0; i < 8; i++) {
			char a;
			cin >> a;

			gear[j].push_back(a - '0');
		}
	}
	cin >> k;
	for (int i = 0; i < k; i++) {
		int num,dir;
		cin >> num >> dir;
		memset(check, false, sizeof(check));
		dfs(num, dir); // rotate_gear에 각 기어 방향 정보저장
		gear_turn();//회전
		
	}
	//점수계산
	cout << total_score();
	
	return 0;
}
profile
후회없이

0개의 댓글