본문 바로가기

Algorithm/Implementation

(C++) - 백준(BOJ) 14891번 : 톱니바퀴 답

반응형

www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴

www.acmicpc.net

simulation 문제였습니다.

 

풀이방법

 1. 매 k 마다 다음을 수행합니다.

  1-1. 4개의 톱니바퀴에 대한 회전 방향 계산 후 배열 저장

  1-2. 회전 방향 정보대로 톱니바퀴 회전

  1-3. 회전 방향 저장 된 배열 초기화

 2. 점수 계산 후 출력

 

Code

#include <bits/stdc++.h>
using namespace std;

int direction[4];
vector<vector<int>> gear;

vector <int> getGearVector(string gearInfo){
    vector <int> tmpGear;
    for(int i = 0; i < 8; i++)
        tmpGear.push_back(gearInfo[i] - '0');
    return tmpGear;
}

void fillDirection(int start, int rotateDirection) {
	int next = start + 1;
	int prev = start - 1;
	direction[start] = rotateDirection;
	if (next < 4 && direction[next] == 0 && gear[start][2] != gear[next][6]) {
		fillDirection(next, rotateDirection * -1);
	}
	if (prev >= 0 && direction[prev] == 0 && gear[start][6] != gear[prev][2]) {
		fillDirection(prev, rotateDirection * -1);
	}
}

void rotateGear() {
	for (int i = 0; i < 4; i++) {
		if (direction[i] == 1) {//시계방향
			int temp = gear[i][7];
			for (int j = 7; j > 0; j--)
				gear[i][j] = gear[i][j - 1];
			gear[i][0] = temp;
		}
		else if (direction[i] == -1) {//반시계방향
			int temp = gear[i][0];
			for (int j = 0; j <7; j++)
				gear[i][j] = gear[i][j + 1];
			gear[i][7] = temp;
		}
	}
}

void clearDirection() {
	for (int i = 0; i < 4; i++) {
		direction[i] = 0;
	}
}

int getPoint(){
    int point = 0;
    for(int i =0; i < 4; i++){
        if(gear[i][0]) point += pow(2,i);
    }
    return point;
}

int main() {
	int gearNum;
	int rotateDirection;
	int k;

	for (int i = 0; i < 4; i++) {
    	string gearInfo;
		cin >> gearInfo;
		gear.push_back(getGearVector(gearInfo));
	}

	cin >> k;
	for (int i = 0; i < k; i++) {
		cin >> gearNum >> rotateDirection;
		fillDirection(gearNum-1, rotateDirection);
		rotateGear();
		clearDirection();
	}

	cout << getPoint();
}