본문 바로가기

algorithm/BOJ

백준 14891_톱니바퀴(C++)

 

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

 

14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터 시계방향 순서대로 주어진다. N극은 0, S극은 1로 나타나있다. 다섯째 줄에는 회전 횟수 K(1 ≤ K ≤ 100)가 주어진다. 다음 K개 줄에는 회전시킨 방법이 순서대로 주어진다. 각 방법은 두 개의 정수로 이루어져 있고, 첫 번째 정수는 회전시킨 톱니바퀴

www.acmicpc.net

[문제 풀이]

시뮬레이션을 이용하여 문제를 풀었습니다.

 

이 문제는 주어진 상황을 순서대로 진행해주는 것이 문제의 핵심입니다. 

이 코드의 경우 톱니바퀴를 map[4][8] 배열을 통해서 선언을 해주었습니다. 그 후, 단순히 주어진 입력 값에 따라 톱니바퀴를 움직여 주면 되는 문제였습니다.

이 코드의 핵심 함수는 moveGear(), rightSpin(), leftSpin() 입니다. 한 가지 주의 해야 될 점은 톱니바퀴가 순차적으로 돌아가는 것이 아닌 양 옆 톱니바퀴의 회전 여부를 정한 후에 같이 톱니바퀴가 돌아간다는 점에 유의하며 풀어야 할 것 같습니다.

[코드]

#include<iostream>
#include<vector>
#include<string>

using namespace std;

int map[4][8];
int spin[4];
vector<pair<int, int>>  v;

int N;

void init();
void moveGear();
void rightSpin(int);
void leftSpin(int);
int score();

int main() {

	init();
	//showMap();
	moveGear();

	printf("%d\n", score());
}

void init() {

	string s;

	for (int i = 0; i < 4; i++) {
		cin >> s;

		for (int j = 0; j < 8; j++) {
			map[i][j] = (int)s.at(j) - 48;
		}
	}

	scanf("%d", &N);

	for (int i = 0; i < N; i++) {
		int a, b;
		scanf("%d %d", &a, &b);
		v.push_back(make_pair(a, b));
	}

}

int score() {

	int result = 0;
	int cal = 1;

	for (int i = 0; i < 4; i++) {

		if (i == 0 && map[i][0] == 1) {
			result = cal;
		}
		else if (map[i][0] == 1) {
			result += cal;
		}

		cal *= 2;
	}

	return result;
}


void rightSpin(int first) {

	int value;

	for (int j = 0; j < 8; j++) {

		if (j == 0) {
			value = map[first][j];
			map[first][j] = map[first][7];
		}
		else if (j == 7) {
			map[first][j] = value;
		}
		else {
			int temp = map[first][j];
			map[first][j] = value;
			value = temp;
		}

	}

}

void leftSpin(int first) {

	int value;

	for (int j = 7; j >= 0; j--) {

		if (j == 7) {
			value = map[first][j];
			map[first][j] = map[first][0];
		}
		else if (j == 0) {
			map[first][j] = value;
		}
		else {
			int temp = map[first][j];
			map[first][j] = value;
			value = temp;
		}

	}

}

void moveGear() {

	for (int i = 0; i < v.size(); i++) {

		int first = v[i].first - 1;
		bool direct = (v[i].second == 1) ? true : false;

		for (int i = 0; i < 4; i++)
			spin[i] = 0;	

		spin[first] = v[i].second;

		while (first > 0) {

			if (map[first][6] != map[first - 1][2]) {
				first--;

				if (direct) {
					direct = false;
					spin[first] = -1;
				}
				else {
					direct = true;
					spin[first] = 1;
				}

			}
			else
				break;

		}

		first = v[i].first - 1;
		direct = (v[i].second == 1) ? true : false;

		while (first < 3) {

			if (map[first][2] != map[first + 1][6]) {
				first++;

				if (direct) {
					direct = false;
					spin[first] = -1;
				}
				else {
					direct = true;
					spin[first] = 1;
				}

			}
			else
				break;

		}

		for (int i = 0; i < 4; i++) {
			if (spin[i] == 1) {
				rightSpin(i);
			}
			else if (spin[i] == -1) {
				leftSpin(i);
			}
		}

	}
}

 

 

'algorithm > BOJ' 카테고리의 다른 글

백준 15686_치킨 배달(C++)  (2) 2020.04.21
백준 14889_스타트와 링크(C++)  (0) 2020.04.18
백준 3190_뱀(C++)  (0) 2020.04.08
백준 2748_피보나치 수 2(C++)  (0) 2020.04.03
백준 7568_덩치(C++)  (3) 2020.04.03