[삼성코테기출문제] 톱니바퀴

2 분 소요

톱니바퀴

문제

시뮬레이션 문제이다. 시뮬레이션은 왜 이렇게 어려운걸까… 문제를 해석하고 조건을 찾는게 어렵다기보단… 다 했는데? 왜 안돼????? 라는 경우가 많다….

문제
문제
문제

문제 풀이

문제 조건을 잘 생각하고 원본이 있고 해당 원본에 대해 여러가지 변경 된 경우가 생길 때에는 꼭 원본을 저장하고 사본을 이용해서 경우를 판단하자.

입출력 조건
입력

풀이 과정

  1. 먼저 4개의 톱니바퀴에 대한 정보를 입력 받고, 명령의 개수 K를 입력 받자. 모든 명령을 받은 뒤 명령을 해결하지 말고, 명령이 주어질 때마다 명령을 해결하자.
  2. 명령의 정보 n(톱니바퀴의 번호), d(방향)을 입력받고 톱니바퀴들이 인접한 부분은 3개이므로
     for (int i = n; i < 3; i++) {
         if (Gear[i][2] != Gear[i + 1][6]) dir[i + 1] = -dir[i];
     }
     for (int i = n; i > 0; i--) {
         if (Gear[i][6] != Gear[i - 1][2]) dir[i - 1] = -dir[i];
     }
    

    위와 같이 처리하여 n을 기준으로 다른 인접한 부분이 서로 다르다면 기준 톱니바퀴와 반대로 회전해야 하므로 -dir을 이용하여 처리해주고 서로 같다면 dir=0으로 처리한다.

  3. 4개의 톱니바퀴에 대해서 dir값이 0이 아니라면 회전시켜준다.
  4. 회전시키는 부분의 함수를 보면 모듈러 연산을 이용하여
    • 시계 방향이면 인덱스의 순서가 01234567에서 12345670으로 바꿔 tmp에 저장해준다.
    • 반시계 방향이면 인덱스의 순서가 01234567에서 70123456으로 바꿔 tmp에 저장해준다.
    • tmp의 값을 다시 Gear에 저장해준다.
  5. 위 과정을 반복하여 명령이 끝나면 톱니바퀴의 0인덱스의 정보를 기준으로 점수를 세어준다.
    점수를 세는 부분에서 1<<i는 비트연산으로 2^i를 의미한다.

#include<iostream>
using namespace std;

char Gear[4][8];
int k, ans;
void Input() {
	for (int i = 0; i < 4; i++) 
		cin >> Gear[i];
	cin >> k;
}
void Rotate(int n, int d) {
	int tmp[8];
	if (d == 1) {
		for (int i = 0; i < 8; i++) {
			tmp[(i + 1) % 8] = Gear[n][i];
		}
	}
	else {
		for (int i = 0; i < 8; i++) {
			tmp[i] = Gear[n][(i + 1) % 8];
		}
	}
	for (int i = 0; i < 8; i++) {
		Gear[n][i] = tmp[i];
	}
}

void Process() {
	while (k--) {
		int n, d;
		cin >> n >> d; n--;
		int dir[4] = { 0 };
		dir[n] = d;
		for (int i = n; i < 3; i++) {
			if (Gear[i][2] != Gear[i + 1][6]) dir[i + 1] = -dir[i];
		}
		for (int i = n; i > 0; i--) {
			if (Gear[i][6] != Gear[i - 1][2]) dir[i - 1] = -dir[i];
		}
		for (int i = 0; i < 4; i++) {
			if (dir[i]) {
				Rotate(i, dir[i]);
			}
		}
	}
}
void Solution() {
	Input();
	Process();
	for (int i = 0; i < 4; i++) {
		if (Gear[i][0]=='1') ans += (1 << i);
	}
	cout << ans << "\n";
}

int main() {
	freopen("13.in", "r", stdin);
	cin.tie(NULL);
	ios::sync_with_stdio(false);
	Solution();
	return 0;
}

댓글남기기