코딩공작소
[백준]톱니바퀴(2) 본문
https://www.acmicpc.net/problem/14891
14891번: 톱니바퀴
첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터 시계방향 순서대로 주어진다. N극은 0, S극은 1로 나타나있다. 다섯째 줄에는 회전 횟수 K(1 ≤ K ≤ 100)가 주어진다. 다음 K개 줄에는 회전시킨 방법이 순서대로 주어진다. 각 방법은 두 개의 정수로 이루어져 있고, 첫 번째 정수는 회전시킨 톱니바퀴
www.acmicpc.net
가장 중요한것은 한번에!! 현 상황에서의 톱니가 맞물려 있는 상황들을 저장하는 것이고, 그 상황에 맞게 돌려주는 것이다.
*참고 : 비트연산
폴시랩
자바스트립트, PHP, 워드프레스, HTML, CSS, 팁, 가이드, 일상이야기.
falsy.me
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
#include <iostream>
using namespace std;
int t[4][8];
int K;
/*새로운 배열에 놓고 옮기는거*/
void rotation(int n, int d) {
int b[8];
if (d == 1) {
for (int i = 0; i < 8; i++) {
b[(i + 1) % 8] = t[n][i];
}
}
else {
for (int i = 0; i < 8; i++) {
b[i] = t[n][(i + 1) % 8];
}
}
for (int i = 0; i < 8; i++) {
t[n][i] = b[i];
}
}
/*Shift로 한칸 씩 밀어서 돌리는거*/
void rotation(int n, int d) {
if (d == 1) {
//시계방향
int tmp = t[n][7];
for (int i = 6; i >= 0; i--) t[n][i + 1] = t[n][i];
t[n][0] = tmp;
}
else if (d == -1) {
//반시계 방향
int tmp = t[n][0];
for (int i = 0; i <= 6; i++) t[n][i] = t[n][i + 1];
t[n][7] = tmp;
}
}
void solve(){
int n, k;
cin >> n >> k; n--;
int d[4] = { 0 };
d[n] = k;
for (int i = n; i < 3; i++) { //우
if (t[i][2] != t[i + 1][6]) d[i + 1] = -d[i];
}
for (int i = n; i > 0; i--) { //좌
if (t[i][6] != t[i - 1][2]) d[i - 1] = -d[i];
}
for (int i = 0; i < 4; i++) {
if (d[i] != 0) rotation(i, d[i]);
}
}
int main()
{
int ans = 0;
for (int i = 0; i < 4; i++) for (int j = 0; j < 8; j++) scanf("%1d", &t[i][j]);
cin >> K;
while (K--) {
solve();
}
for (int i = 0; i < 4; i++) {
if (t[i][0] != 0) ans += 1 << i; //비트 연산 1,2,4,8 나옴.
}
printf("%d\n", ans);
return 0;
}
|
cs |
'알고리즘 > 시뮬레이션' 카테고리의 다른 글
[NHN모의테스트]전광판광고 (0) | 2019.09.24 |
---|---|
[백준]색종이 (0) | 2019.09.14 |
[백준]경사로(두번) (0) | 2019.09.04 |
[SWEA]무선충전 (0) | 2019.09.01 |
[백준]미로만들기 (1) | 2019.08.23 |