※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 14891번 문제인 톱니바퀴이다.
문제는 아래 링크를 확인하자.

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

 

14891번: 톱니바퀴

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

www.acmicpc.net

톱니바퀴의 개수와 조작횟수가 적으므로 문제에서 주어진 톱니바퀴의 회전을 그대로 구현하는 것으로 문제를 해결할 수 있다.

 

글쓴이는 미리 주어진 톱니바퀴의 왼쪽과 오른쪽을 하나하나 차례로 살피면서 회전해야 할 톱니바퀴들을 미리 표기하고, 모두 표기한 다음에 회전시킬 톱니바퀴들만 방향에 맞춰 회전시키는 방식으로 코드를 구현하였다.

 

톱니바퀴의 회전은 문자열을 잘라 붙이는 것으로 해결했다.

 

아래는 제출한 소스코드이다.

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

int rot[6];
string gear[6];

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

	gear[0] = gear[5] = "99999999";
	for (int i = 1; i <= 4; i++) cin >> gear[i];

	int T; cin >> T;
	while (T--) {
		memset(rot, 0, sizeof(rot));
		int x, r; cin >> x >> r;
		rot[x] = r;
		int rr = r * -1, idx = x - 1;
		if (idx > 0) {
			while ((int)gear[idx][2] + (int)gear[idx + 1][6] == (int)'0' + (int)'1') {
				rot[idx--] = rr;
				rr *= -1;
			}
		}
		rr = r * -1, idx = x + 1;
		if (idx < 5) {
			while ((int)gear[idx - 1][2] + (int)gear[idx][6] == (int)'0' + (int)'1') {
				rot[idx++] = rr;
				rr *= -1;
			}
		}
		for (int i = 1; i < 5; i++) {
			if (rot[i] == 1) {
				gear[i] = gear[i].substr(7, 1) + gear[i].substr(0, 7);
			}
			else if (rot[i] == -1) gear[i] = gear[i].substr(1, 7) + gear[i].substr(0, 1);
		}
	}
	int ans = 0;
	if (gear[1][0] == '1') ans += 1;
	if (gear[2][0] == '1') ans += 2;
	if (gear[3][0] == '1') ans += 4;
	if (gear[4][0] == '1') ans += 8;

	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 1058 // C++] 친구  (0) 2021.09.19
[BOJ 2661 // C++] 좋은수열  (0) 2021.09.18
[BOJ 13904 // C++] 과제  (0) 2021.09.16
[BOJ 3109 // C++] 빵집  (0) 2021.09.15
[BOJ 19598 // C++] 최소 회의실 개수  (0) 2021.09.14

+ Recent posts