[C++] 백준-14891 :

문제

백준 – 14891: 기어

14891: 기어

1열 기어1 상태, 2열 기어2 상태, 3열 기어3 상태, 4열 기어4 상태. 상태는 12시 방향에서 시작하는 8개의 정수로 구성됩니다.

www.acmicpc.net

설명

이 문제는 시뮬레이션 문제였습니다.

기어를 회전시키는 방법(어레이 좌우이동)과 기어를 회전시키면서 양쪽으로 기어를 회전시키는 방법

어떻게 대처해야 할지 고민해야 했다.

첫 번째 솔루션은 setWheel 함수의 회전을 구현했지만 “rotate”라는 유용한 함수가 있으므로 수정했습니다.

setWheel 함수는 회전 함수가 사용된 방향으로 이동하며 방향과 기어 수만 지정됩니다.

재귀 함수로 좌우 기어 응답을 구현했습니다. 오른쪽 및 왼쪽 기능은 이동하려는 기어를 기준으로 합니다.

별도로 구현되며, 1~4의 범위를 벗어나거나 전극이 같을 경우 아무런 변화 없이 기능이 종료되며, 조건이 만족되면 다음 기어에 setWheel 기능이 적용되며, 그런 다음 Die Function이 다시 호출되어 반복됩니다. 여기서 기어가 정상적으로 회전하려면 dir에 -1을 곱하여 반전시켜야 합니다.

회전 함수는 알고리즘 라이브러리에 저장된 함수입니다.

인수는 (시작 반복자, 시작 위치의 모든 반복자, 끝 반복자)로 구성되며 대표적인 예는 다음과 같습니다.

회전 (v.begin(), v.begin()+1, v.end()); // 시계 반대 방향
Rotate(v.begin(),v.begin() + v.size() – 1, v.end()) // 시계 방향

로 사용할 수 있습니다

소스 코드

#include <bits/stdc++.h>

using namespace std;

string wheel(5);
int K;

void setWheel(int n, int dir){
	if(dir==1){
		rotate(wheel(n).begin(), wheel(n).begin()+7, wheel(n).end());	
	}
	else{
		rotate(wheel(n).begin(), wheel(n).begin()+1, wheel(n).end());
	}
}

void moveRight(int cur, int dir){
	if(cur>=4) return;
	if(wheel(cur)(2+dir)!=wheel(cur+1)(6)) {
		setWheel(cur+1, -dir);
		moveRight(cur+1, -dir);
	}
}

void moveLeft(int cur, int dir){
	if(cur<=1) return;
	if(wheel(cur)(6+dir)!=wheel(cur-1)(2)) {
		setWheel(cur-1, -dir);
		moveLeft(cur-1, -dir);
	}
}

int main(void){
	ios::sync_with_stdio(0);
	cin.tie(0);
	
	for(int i=1;i<=4;i++){
		cin >> wheel(i);
	}
	cin >> K;
	while(K--){
		int n, dir;
		cin >> n >> dir;
		setWheel(n,dir);
		moveRight(n,dir);
		moveLeft(n,dir);
	}
	
	int answer = 0;
	for(int i=1;i<=4;i++){
		if(wheel(i)(0)=='1'){
			answer += (1<<(i-1));
		}
	}
	
	cout << answer;
	return 0;
}

/*
void setWheel(int n, int dir){
	int temp;
	int start = wheel(n)(0);
	int end = wheel(n)(7);	
	if(dir==1){
		temp = start;
		for(int i=0;i<7;i++){
			int t = wheel(n)(i+1);
			wheel(n)(i+1) = temp;
			temp = t;
			
		}
		wheel(n)(0) = temp;
		
	}
	else{
		temp = end;		
		for(int i=7;i>0;i--){
			int t = wheel(n)(i-1);
			wheel(n)(i-1) = temp;
			temp = t;
		}	
		wheel(n)(7) = temp;
	}
}
*/

검토

“rotate()”라는 새로운 함수에 대해 알아봤는데 단순히 반복적으로 회전하기 때문에 시간 복잡도가 중요한 문제라면

조심해야 할 것 같습니다. 최대한 깔끔하게 해결하려고 노력했지만 아직 해결하는 과정에 있습니다.

버그가 너무 많아서 시간이 좀 걸립니다.

감사해요