GitHubSeob

C++ / 백준 / 14891 / 톱니바퀴 본문

Baekjoon/Gold

C++ / 백준 / 14891 / 톱니바퀴

GitHubSeob 2023. 10. 4.
문제

 

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

 

14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터

www.acmicpc.net

 

 

문제풀이

 

톱니바퀴가 회전할 때는 처음 입력받은 톱니바퀴는 반드시 회전한다.

그다음 인접한 톱니바퀴는 회전하고 난 후가 아닌 회전하기 전의 기준 톱니바퀴와의 조건을 따져야 한다.

 

prev_gear와 gear를 따로 두어 조건을 따지는 톱니바퀴는 prev_gear를 이용하고, 회전을 할 때는 gear의 톱니바퀴를 회전하였다.

 

왼쪽 톱니바퀴의 [2]와 오른쪽 톱니바퀴의 [6]의 극을 따져야 한다.

극이 같다면, 톱니바퀴는 회전하지 않으므로 break를 통해 중단한다.

극이 다르다면, 톱니바퀴는 회전한다.

한번 회전하면 그다음 톱니바퀴는 반대방향으로 회전하므로 회전할 때마다 -1을 곱해줘야 한다.

 

void rotate(int loc, int dir) {
	if (dir == 1) {
		gear[loc].insert(0, 1, gear[loc].back());
		gear[loc].erase(8, 1);
	}
	else if (dir == -1) {
		gear[loc] += gear[loc][0];
		gear[loc].erase(0, 1);
	}
}

톱니바퀴를 회전시키는 함수이다.

톱니바퀴의 상태는 string형에 담겨있으므로 시계방향으로 회전할 때는 맨 앞에 맨뒤의 극을 삽입하고, 마지막 극을 삭제한다.

반시계방향으로 회전할 때는 맨뒤에 맨 앞의 극을 삽입하고, 맨 앞의 극을 삭제한다.

 

	for (int idx = 0; idx < 4; ++idx) {
		if (gear[idx][0] != '0') answer += score;
		score *= 2;
	}

마지막으로 점수를 매길 때는 톱니바퀴의 12시 방향인 [0]의 극만 확인하면 된다.

 

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

vector<string>gear(4);
vector<string>prev_gear(4);

void rotate(int loc, int dir) {
	if (dir == 1) {
		gear[loc].insert(0, 1, gear[loc].back());
		gear[loc].erase(8, 1);
	}
	else if (dir == -1) {
		gear[loc] += gear[loc][0];
		gear[loc].erase(0, 1);
	}
}

void left_gear(int num, int dir) {
	for (int left = num - 1; left >= 0; --left) {
		if (prev_gear[left][2] == prev_gear[left + 1][6]) break;
		rotate(left, dir);
		dir *= -1;
	}
}

void right_gear(int num, int dir) {
	for (int right = num + 1; right < 4; ++right) {
		if (prev_gear[right - 1][2] == prev_gear[right][6]) break;
		rotate(right, dir);
		dir *= -1;
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	for (int idx = 0; idx < 4; ++idx) {
		cin >> gear[idx];
		prev_gear[idx] = gear[idx];
	}

	int K(0);
	cin >> K;

	int num(0), dir(0);
	for (int idx = 0; idx < K; ++idx) {
		cin >> num >> dir;
		--num;

		rotate(num, dir);
		left_gear(num, dir * -1);
		right_gear(num, dir * -1);

		for (int idx2 = 0; idx2 < 4; ++idx2) {
			prev_gear[idx2] = gear[idx2];
		}
	}

	int answer(0), score(1);
	for (int idx = 0; idx < 4; ++idx) {
		if (gear[idx][0] != '0') answer += score;
		score *= 2;
	}
	cout << answer;
}

 

'Baekjoon > Gold' 카테고리의 다른 글

C++ / 백준 / 1245 / 농장 관리  (0) 2023.10.15
C++ / 백준 / 13422 / 도둑  (0) 2023.10.06
C++ / 백준 / 14500 / 테트로미노  (0) 2023.09.21
C++ / 백준 / 13905 / 세부  (0) 2023.09.21
C++ / 백준 / 2637 / 장난감 조립  (2) 2023.09.09