https://www.acmicpc.net/problem/14891
백준저지 14891번 문제 톱니바퀴 문제 풀이이다.
시뮬레이션 문제이다. 톱니바퀴가 도는 모습을 하나하나 따라가면 된다.
회전하는 경우를 어떻게 구현할 것인가가 관건인데, 12시 방향에 있는 좌표를 저장하는 방식으로 하였다.
Cyclic하게 회전하므로 방향 개수로 Modular 연산을 통해서 cyclic한 형태를 구현할 수 있다.
#include <bits/stdc++.h>
using namespace std;
int gear[4][8];
int pos[4]; //12시 방향을 의미함. ++하면 반시계, --하면 시계방향 회전
int rot_delta[4];
int get_polar(int num, int clock) {
int base = pos[num] + clock;
if (base >= 8) {
base = base % 8;
}
while (base < 0) {
base += 8;
}
return gear[num][base];
}
int main() {
for (int i=0; i < 4; i++) {
for (int j=0; j < 8; j++) {
scanf("%1d", &gear[i][j]);
}
}
int rot;
cin >> rot;
for (int i=0; i < rot; i++) {
int num, dir;
cin >> num >> dir;
num--;
rot_delta[num] = dir; //현재꺼 회전량 저장
int prev = num;
int cur = prev + 1;
int prev_dir = dir;
while (cur < 4) {
if (get_polar(prev, 2) == get_polar(cur, 6)) break;
rot_delta[cur] = -prev_dir;
prev_dir = -prev_dir;
prev = cur;
cur++;
}
prev = num;
cur = prev - 1;
prev_dir = dir;
while (cur >= 0) {
if (get_polar(prev, 6) == get_polar(cur, 2)) break;
rot_delta[cur] = -prev_dir;
prev_dir = -prev_dir;
prev = cur;
cur--;
}
for (int j=0; j < 4; j++){
pos[j] -= rot_delta[j];
rot_delta[j] = 0;
}
}
int ans = 0;
ans += (get_polar(0, 0) == 0 ? 0 : 1);
ans += (get_polar(1, 0) == 0 ? 0 : 2);
ans += (get_polar(2, 0) == 0 ? 0 : 4);
ans += (get_polar(3, 0) == 0 ? 0 : 8);
cout << ans << endl;
return 0;
}
'알고리즘 & Problem Solving' 카테고리의 다른 글
백준 10090번 문제 Counting Inversions 문제 풀이 (0) | 2018.10.18 |
---|---|
백준저지 10828번 스택 문제 풀이 (0) | 2018.06.05 |
백준 14890번 경사로 풀이 (0) | 2018.04.22 |
백준 14889번 스타트와 링크 문제 풀이 (0) | 2018.04.22 |
백준 14888번 연산자 끼워넣기 풀이 (0) | 2018.04.22 |