알고리즘/BaekJoon

백준 14891 : 톱니바퀴

꾸준하게 :) 2020. 3. 24. 15:36

문제 링크입니다 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

총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있습니다.

 

 

톱니바퀴를 총 K번 회전시키는데, 톱니바퀴가 회전할 때, 시계방향 혹은 반 시계방향으로 회전시킬 수 있는데 서로 맞닿은 극이 다르면 옆에 있는 톱니바퀴도 반대 방향으로 같이 회전하게 됩니다. 톱니바퀴의 초기 상태와 톱니바퀴를 회전시킨 방법이 주어졌을 때, 최종 톱니바퀴의 상태를 구하는 문제였습니다.

 

 

[소스코드]

 

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
74
#include<iostream>
using namespace std;
 
int k, ans, gear[5][10];    // 12시부터 시계방향, N극은 0, S극은 1
 
// 회전시킬 톱니바퀴의 번호(배열의 인덱스)와 방향을 입력받고
// 그 방향으로 회전한 결과를 gear 배열에 update 해주는 함수
void getResult(int num, int dir) {
 
    if (dir == 1) {
        // 시계 방향으로 회전합니다
        int temp = gear[num][7];
        for (int i = 7; i > 0; i--) {
            gear[num][i] = gear[num][i - 1];
        }
        gear[num][0= temp;
    }
    else {
        // 반 시계 방향으로 회전합니다
        int temp = gear[num][0];
        for (int i = 0; i < 7; i++) {
            gear[num][i] = gear[num][i + 1];
        }
        gear[num][7= temp;
    }
}
 
int main(void) {
    for (int i = 0; i < 4; i++)
        for (int j = 0; j < 8; j++)
            scanf("%1d"&gear[i][j]);
 
    cin >> k;
    while (k--) {
        int a, b;
        scanf("%d%d"&a, &b);
 
        // 0 ~ 3번까지 톱니바퀴 4개를 어느 방향으로 회전할지
        // 결정하여 담을 result 배열
        int result[4= { 0, };
        int num = a - 1;
 
        // 입력받은 톱니바퀴는 b 방향으로 회전
        result[num] = b;
 
        // 현재 톱니바퀴의 오른쪽 톱니바퀴의
        // 회전 방향을 결정합니다
        for (int i = num; i < 3; i++)
            if (gear[i][2!= gear[i + 1][6])
                result[i + 1= -result[i];
 
        // 현재 톱니바퀴의 왼쪽 톱니바퀴의 
        // 회전 방향을 결정합니다
        for (int i = num; i > 0; i--)
            if (gear[i][6!= gear[i - 1][2])
                result[i - 1= -result[i];
 
        // 결정된 각 방향으로 톱니바퀴를 회전합니다
        for (int i = 0; i < 4; i++)
            if (result[i] != 0)
                getResult(i, result[i]);
    }
    for (int i = 0; i < 4; i++) {
        if (gear[i][0== 0continue;
        else {
            if (i == 0) ans += 1;
            else if (i == 1) ans += 2;
            else if (i == 2) ans += 4;
            else if (i == 3) ans += 8;
        }
    }
    cout << ans << '\n';
    return 0;
}
cs

 

'알고리즘 > BaekJoon' 카테고리의 다른 글

백준 2884 : 알람 시계  (0) 2020.04.23
백준 1012 : 유기농 배추  (0) 2020.04.21
백준 14499 : 주사위 굴리기  (0) 2020.03.22
백준 1181 : 단어 정렬  (0) 2020.03.15
백준 15666 : N과 M(12)  (0) 2020.03.14