[백준] 14891번 톱니바퀴 (C++, 삼성 기출)

코딩은 많은 시행착오·2022년 3월 15일
0

swea

목록 보기
6/10

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

이 문제는 단순 구현 문제이다.

배열로 회전 방향을 저장해주고, 재귀를 통해 왼쪽과 오른쪽 톱니의 회전 여부를 체크해준다.
그 이후 회전 방향에 따라 톱니를 회전시키면 된다.

처음에 문제를 잘 안읽고 회전 시켜서 풀다가 고생했다.

  1. 회전 방향을 저장하는 배열에 현재 인덱스와 회전 방향을 저장해준다.
  2. 재귀를 이용해 왼쪽, 오른쪽의 회전 여부를 체크해준다.
  3. 톱니를 방향에 맞게 회전시킨다.
#include <iostream>
#include <cstring>

using namespace std;
string gear[4];
int isRotate[4];

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

void move(int idx, int clock) {
	if (clock == 1)
		gear[idx] = gear[idx].substr(7) + gear[idx].substr(0, 7);
	else if(clock == -1)
		gear[idx] = gear[idx].substr(1, 7) + gear[idx].substr(0, 1);
}

void left_check(int idx, int clock) {
	if (idx <= 0) return;
	if (gear[idx][6] != gear[idx - 1][2]) {
		isRotate[idx - 1] = clock * -1;
		left_check(idx - 1, clock * -1);
	}
}

void right_check(int idx, int clock) {
	if (idx >= 3) return;
	if (gear[idx][2] != gear[idx + 1][6]) {
		isRotate[idx + 1] = clock * -1;
		right_check(idx + 1, clock * -1);
	}
}

void check(int idx, int clock) {
	isRotate[idx] = clock;
	left_check(idx, clock);
	right_check(idx, clock);

	for(int i = 0; i < 4; i++)
		move(i, isRotate[i]);
}


int main() {
	int ans = 0;
	for (int i = 0; i < 4; i++) {
		cin >> gear[i];
	}
	int k;
	int g; int r;
	cin >> k;
	for (int i = 0; i < k; i++) {
		cin >> g >> r;
		init();
		check(g - 1, r);
	}
	int mul = 1;
	for (int i = 0; i < 4; i++) {
		ans += (gear[i][0] - '0') * mul;
		mul *= 2;
	}
	
	cout << ans;
}

0개의 댓글