알고리즘 문제/[백준]

[백준] 14891 톱니바퀴

latter2005 2021. 1. 10. 18:23

문제 주소 : www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터

www.acmicpc.net

문제 확인

 

간단한 시뮬레이션 문제입니다. 주어진 상황을 그대로 구현하면 됩니다.

 

풀이

 

톱니바퀴의 왼쪽과 오른쪽을 가리키는 인덱스를 저장시켜두고 방향 전환을 하면서 맞춰 기록해갑니다.

톱니바퀴가 회전할 때 서로 맞닿은 극에 따라 옆에있는 톱니바퀴의 회전이 결정됩니다. 회전 시 맞닿은 톱니의 극이 다르다면 옆의 톱니바퀴는 반대방향으로 회전하게 됩니다.

 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <cstdio>
#define mod(x,d) x=d!=1?(x+1)%8:(x+7)%8
#define flip(x) x!=1?1:-1
char a[4][9];
int p[4][3= { {0,2,6},{0,2,6},{0,2,6},{0,2,6} }, n, cur, d, i, l, r;//오웬
int main() {
    scanf("%s%s%s%s", a[0], a[1], a[2], a[3]);
    scanf("%d"&n);
    for (i = 0; i < n; i++) {
        scanf("%d%d"&cur, &d); cur--;
        for (l = cur - 1; l >= 0 && a[l][p[l][1]] != a[l + 1][p[l + 1][2]]; l--);
        for (r = cur + 1; r < 4 && a[r - 1][p[r - 1][1]] != a[r][p[r][2]]; r++);
        for (int k = cur, td = d; k > l; k--, td = flip(td)) {
            mod(p[k][0], td); mod(p[k][1], td); mod(p[k][2], td);
        }
        for (int k = cur + 1, td = flip(d); k < r; k++, td = flip(td)) {
            mod(p[k][0], td); mod(p[k][1], td); mod(p[k][2], td);
        }
    }
    for (i = 0, n = 0, cur = 1; i < 4; i++, cur <<= 1)
        if (a[i][p[i][0]] == '1') n += cur;
    printf("%d", n);
}
cs
반응형

'알고리즘 문제 > [백준]' 카테고리의 다른 글

[백준] 13334 철로  (0) 2021.01.14
[백준] 9376 탈옥  (0) 2021.01.12
[백준] 1444 숌 언어  (0) 2021.01.07
[백준] 15562 네트워크  (0) 2021.01.04
[백준] 18233 러버덕을 사랑하는 모임  (0) 2021.01.03