알고리즘 공부/C++

[G5] 백준 15662번 톱니바퀴 (2) C++ 덱, 구현, 시뮬레이션

마달랭 2025. 2. 26. 21:37

리뷰

 

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

톱니바퀴를 회전시켜 연쇄반응을 구현하는 문제

 

 

전역 변수

  • t : 톱니바퀴의 개수를 저장할 변수
  • k : 회전의 횟수를 저장할 변수
  • flag : 회전 방향을 체크하기 위한 변수
  • deq : 톱니바퀴의 상태를 저장할 덱 배열

 

함수

1. turn_right

void turn_right(int idx)

 

톱니바퀴를 오른쪽으로 회전시키는 시뮬레이션을 진행할 함수

  1. 매개 변수로 톱니바퀴의 번호 idx를 전달 받는다.
  2. 톱니바퀴 번호가 idx인 덱에서 뒤의 요소를 뺀 뒤 앞의 요소로 집어넣는다.
  3. 작업 후에는 flag를 반전시킨다.

 

2. turn_left

void turn_left(int idx)

 

톱니바퀴를 왼쪽으로 회전시키는 시뮬레이션을 진행할 함수

  1. 매개 변수로 톱니바퀴의 번호 idx를 전달 받는다.
  2. 톱니바퀴 번호가 idx인 덱에서 앞의 요소를 뺀 뒤 뒤의 요소로 집어넣는다.
  3. 작업 후에는 flag를 반전시킨다.

 

문제풀이

  1. t값을 입력 받고, t개의 톱니바퀴 정보를 입력 받아 deq배열에 값을 push해준다.
  2. k값을 입력 받고, k번의 while루프를 수행하고, 매 루프마다 톱니바퀴의 번호 a, 회전 정보 b를 입력 받는다.
  3. 벡터 left, right에 회전이 필요한 톱니바퀴 번호를 저장해준다, 앞쪽의 톱니바퀴 2번과 뒤쪽 6번이 다르면 된다.
  4. b가 -1이라면 a번 톱니바퀴를 왼쪽, 1이라면 오른쪽으로 회전시킨다.
  5. left, right 벡터를 순회하며 flag에 따라 톱니바퀴를 왼쪽 및 오른쪽으로 회전시킨다.
  6. 작업이 모두 종료된 후 모든 톱니바퀴를 순회하며 12시의 극이 S 즉 1인 경우의 개수를 구해 출력한다.

 

트러블 슈팅

없음

 

 

참고 사항

  • 입력이 불친절하므로 문자열로 받아 처리하거나 문자로 받아 정수로 파싱해 사용하면 편하다.

 

정답 코드

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

int t, k, flag;
deque<char> deq[1001];

void turn_right(int idx) {
	char ch = deq[idx].back();
	deq[idx].pop_back();
	deq[idx].push_front(ch);
	flag ^= 1;
}

void turn_left(int idx) {
	char ch = deq[idx].front();
	deq[idx].pop_front();
	deq[idx].push_back(ch);
	flag ^= 1;
}

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

	cin >> t;
	for (int i = 1; i <= t; ++i) {
		string s; cin >> s;
		for (int j = 0; j < 8; ++j) {
			deq[i].push_back(s[j]);
		}
	}

	cin >> k;
	while (k--) {
		int a, b; cin >> a >> b;
		vector<int> left, right;

		int L = a;
		while (--L > 0) {
			if (deq[L][2] != deq[L + 1][6]) left.push_back(L);
			else break;
		}

		int R = a;
		while (++R <= t) {
			if (deq[R - 1][2] != deq[R][6]) right.push_back(R);
			else break;
		}

		flag = 0;
		if (b == -1) {
			turn_left(a);
			for (int i : left) {
				if (flag) turn_right(i);
				else turn_left(i);
			}

			flag = 1;
			for (int i : right) {
				if (flag) turn_right(i);
				else turn_left(i);
			}
		}
		else if (b == 1) {
			turn_right(a);
			for (int i : left) {
				if (flag) turn_left(i);
				else turn_right(i);
			}

			flag = 1;
			for (int i : right) {
				if (flag) turn_left(i);
				else turn_right(i);
			}
		}
	}

	int ans = 0;
	for (int i = 1; i <= t; ++i) {
		if (deq[i][0] == '1') ans++;
	}
	cout << ans;
}
728x90