백준 14891번 톱니바퀴

조항주·2022년 4월 19일
0

algorithm

목록 보기
38/50
post-thumbnail

문제

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

코드

#include <vector>
#include <iostream>
#include<string>
using namespace std;

string shift(string s, int d) {
	if (d == 1) return s[7] + s.substr(0, 7);
	else return s.substr(1, 7) + s[0];
}

int main() {
	string gears[4];
	int k;
	vector<bool> connect(3);
	for (int i = 0; i < 4; i++) {
		cin >> gears[i];
	}
	cin >> k;
	for (int i = 0; i < k; i++) {
		int num, d;
		cin >> num >> d;
		if (gears[0][2] != gears[1][6]) connect[0] = true;
		else connect[0] = false;
		if (gears[1][2] != gears[2][6]) connect[1] = true;
		else connect[1] = false;
		if (gears[2][2] != gears[3][6]) connect[2] = true;
		else connect[2] = false;

		if (num == 1) {
			gears[0] = shift(gears[0], d);
			if (connect[0]) {
				gears[1] = shift(gears[1], -d);
				if (connect[1]) {
					gears[2] = shift(gears[2], d);
					if (connect[2]) {
						gears[3] = shift(gears[3], -d);
					}
				}
			}
		}
		else if (num == 2) {
			gears[1] = shift(gears[1], d);
			if (connect[0]) {
				gears[0] = shift(gears[0], -d);
			}
			if (connect[1]) {
				gears[2] = shift(gears[2], -d);
				if (connect[2]) {
					gears[3] = shift(gears[3], d);
				}
			}
		}
		else if (num == 3) {
			gears[2] = shift(gears[2], d);
			if (connect[2]) {
				gears[3] = shift(gears[3], -d);
			}
			if (connect[1]) {
				gears[1] = shift(gears[1],-d);
				if (connect[0]) {
					gears[0] = shift(gears[0], d);
				}
			}
		}
		else if (num == 4) {
			gears[3] = shift(gears[3], d);
			if (connect[2]) {
				gears[2] = shift(gears[2], -d);
				if (connect[1]) {
					gears[1] = shift(gears[1], d);
					if (connect[0]) {
						gears[0] = shift(gears[0], -d);
					}
				}
			}
		}
	
	}

	int answer = 0;
	int n = 1;
	for (int i = 0; i < 4; i ++) {
		if (gears[i][0] == '1') 
			answer += n;
		n *= 2;
	}
	cout << answer;
}

풀이

특별한 알고리즘 없이 문제에서 하라는대로 구현하는 문제였습니다 어려운건 없었고 문제에서 톱니바퀴의 정보를 2진수로 주는데 회전할 때마다 값을 시프트 해줘야 합니다 이것만 잘 표현하시면 쉽게 문제 풀 수 있을겁니다

0개의 댓글