알고리즘/백준
백준 14891번 톱니바퀴 C/C++ 풀이
Chavo Kim
2020. 8. 5. 22:27
https://www.acmicpc.net/problem/14891
14891번: 톱니바퀴
총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴
www.acmicpc.net
이 역시 시뮬레이션 문제.
하드한 원자 소멸 시뮬레이션 풀고 오니 간단하게 풀었던 문제.
시계 방향과 반시계 방향의 회전을 구현하기 위해서 deque(덱) 자료구조를 사용하였다.
#include <cstdio>
#include <deque>
#include <utility>
using namespace std;
//입력이 길면 귀찮아서 file로 받음
FILE* in = fopen("input.txt", "r");
int k;
//각각의 톱니바퀴를 deque으로 구현
deque<int> fir;
deque<int> sec;
deque<int> thi;
deque<int> fou;
//각 톱니바퀴 사이에 극이 다른지를 확인하는 boolean 배열
bool diff[3];
//diff 배열을 갱신하기 위한 함수
void is_diff() {
diff[0] = (fir[2] != sec[6]);
diff[1] = (sec[2] != thi[6]);
diff[2] = (thi[2] != fou[6]);
}
// 회전을 구현하기 위한 함수, c에 0이 들어왔을 때에는 어떠한 변화도 일어나지 않음
void turn(deque<int>& wheel, int c) {
if (c == -1)
{
wheel.push_back(wheel[0]);
wheel.pop_front();
}
else if (c == 1)
{
wheel.push_front(wheel[7]);
wheel.pop_back();
}
}
// 입력값이 주어졌을 때 변화를 내기 위한 함수
void start(int b, int c) {
//방향값을 모두 0으로 초기화
int d1 = 0, d2 = 0, d3 = 0, d4 = 0;
// 돌리는 톱니바퀴가 어떤 톱니바퀴인지 판별
switch (b) {
case 1:
d1 = c;
//diff의 값에 따라 방향이 결정. 없을 경우 0으로 되어 회전이 일어나지 않음.
if (diff[0])
d2 = -d1;
if (diff[1])
d3 = -d2;
if (diff[2])
d4 = -d3;
break;
case 2:
d2 = c;
if (diff[0])
d1 = -d2;
if (diff[1])
d3 = -d2;
if (diff[2])
d4 = -d3;
break;
case 3:
d3 = c;
if (diff[2])
d4 = -d3;
if (diff[1])
d2 = -d3;
if (diff[0])
d1 = -d2;
break;
case 4:
d4 = c;
if (diff[2])
d3 = -d4;
if (diff[1])
d2 = -d3;
if (diff[0])
d1 = -d2;
break;
}
turn(fir, d1);
turn(sec, d2);
turn(thi, d3);
turn(fou, d4);
//모두 돌려준 후 diff 배열 갱신
is_diff();
}
int main() {
//입력
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 8; j++)
{
int a;
fscanf(in, "%1d", &a);
switch (i) {
case 0 :
fir.push_back(a);
break;
case 1:
sec.push_back(a);
break;
case 2:
thi.push_back(a);
break;
case 3:
fou.push_back(a);
break;
}
}
}
is_diff();
fscanf(in, "%d", &k);
for (int i = 0; i < k; i++)
{
int b, c;
fscanf(in, "%d %d", &b, &c);
start(b, c);
}
int ans = 0;
ans += fir[0];
ans += (2 * sec[0]);
ans += (4 * thi[0]);
ans += (8 * fou[0]);
printf("%d", ans);
return 0;
}