[삼성코테기출문제] 톱니바퀴
톱니바퀴
문제
시뮬레이션
문제이다. 시뮬레이션은 왜 이렇게 어려운걸까… 문제를 해석하고 조건을 찾는게 어렵다기보단… 다 했는데? 왜 안돼????? 라는 경우가 많다….
문제 풀이
문제 조건을 잘 생각하고 원본이 있고 해당 원본에 대해 여러가지 변경 된 경우가 생길 때에는 꼭 원본을 저장하고 사본을 이용해서 경우를 판단하자.
풀이 과정
- 먼저 4개의 톱니바퀴에 대한 정보를 입력 받고, 명령의 개수
K
를 입력 받자. 모든 명령을 받은 뒤 명령을 해결하지 말고, 명령이 주어질 때마다 명령을 해결하자. - 명령의 정보
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
으로 처리한다. - 4개의 톱니바퀴에 대해서
dir
값이 0이 아니라면 회전시켜준다. - 회전시키는 부분의 함수를 보면 모듈러 연산을 이용하여
- 시계 방향이면 인덱스의 순서가
01234567
에서12345670
으로 바꿔tmp
에 저장해준다. - 반시계 방향이면 인덱스의 순서가
01234567
에서70123456
으로 바꿔tmp
에 저장해준다. tmp
의 값을 다시Gear
에 저장해준다.
- 시계 방향이면 인덱스의 순서가
- 위 과정을 반복하여 명령이 끝나면 톱니바퀴의
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;
}
댓글남기기