Home 톱니바퀴[백준 14891번]
Post
Cancel

톱니바퀴[백준 14891번]

톱니바퀴 [백준 14891]

문제

문제링크

https://www.acmicpc.net/problem/14891

문제 내용

  • 총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다.
  • 톱니바퀴를 총 K번 회전시키려고 한다. 톱니바퀴의 회전은 한 칸을 기준으로 한다. 회전은 시계 방향과 반시계 방향이 있다.
  • 톱니바퀴가 회전할 때, 서로 맞닿은 극에 따라서 옆에 있는 톱니바퀴를 회전시킬 수도 있고, 회전시키지 않을 수도 있다. 톱니바퀴 A를 회전할 때, 그 옆에 있는 톱니바퀴 B와 서로 맞닿은 톱니의 극이 다르다면, B는 A가 회전한 방향과 반대방향으로 회전하게 된다.

입력

  • 첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다.
  • 상태는 8개의 정수로 이루어져 있고, 12시방향부터 시계방향 순서대로 주어진다. N극은 0, S극은 1로 나타나있다.
  • 다섯째 줄에는 회전 횟수 K(1 ≤ K ≤ 100)가 주어진다. 다음 K개 줄에는 회전시킨 방법이 순서대로 주어진다.
  • 각 방법은 두 개의 정수로 이루어져 있고, 첫 번째 정수는 회전시킨 톱니바퀴의 번호, 두 번째 정수는 방향이다. 방향이 1인 경우는 시계 방향이고, -1인 경우는 반시계 방향이다.

출력

  • 총 K번 회전시킨 이후에 네 톱니바퀴의 점수의 합을 출력한다. 점수란 다음과 같이 계산한다.
    • 1번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 1점
    • 2번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 2점
    • 3번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 4점
    • 4번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 8점

문제 풀이

풀이 과정

  • 글에서 설명하는 과정을 순서대로 따라서 짠다.
  • 회전상태를 전부 체크한 후, 하나씩 회전하기 시작한다.

소스코드

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
#include <iostream>
#include <string>
#include <vector>

using namespace std;

vector<vector<int> > cogwheel(4);
vector<bool> visited(4);

void rotateGear(int gear_number, int rotate_way){
    if(rotate_way == 1) {
        int temp = cogwheel[gear_number][7];
        cogwheel[gear_number].pop_back();
        cogwheel[gear_number].insert(cogwheel[gear_number].begin(), temp);
    }else if (rotate_way == -1) {
        int temp = cogwheel[gear_number].front();
        cogwheel[gear_number].erase(cogwheel[gear_number].begin());
        cogwheel[gear_number].push_back(temp);
    }
}

void checkStatus(int gear_number, int rotate_way) {
    visited[gear_number] = true;
    int left_number = gear_number - 1;
    int right_number = gear_number + 1;
    if(0 <= left_number && !visited[left_number]) {
        if(cogwheel[left_number][2] != cogwheel[gear_number][6]) {
            checkStatus(left_number, rotate_way * (-1));
        }
    }
    if(right_number < 4 && !visited[right_number]) {
        if(cogwheel[right_number][6] != cogwheel[gear_number][2]) {
                checkStatus(right_number, rotate_way * (-1));
        }
    }
    rotateGear(gear_number, rotate_way);
}

int main() {
    int rotateCount = 0;
    int answer = 0;
    int total_value = 1;
    // 톱니바퀴 정보 입력
    for(int i = 0; i < cogwheel.size(); i++) {
        string input_value;
        cin >> input_value;
        for(int j = 0; j < input_value.length(); j++) {
            cogwheel[i].push_back(input_value[j] - '0');
        }
    }
    // 회전 횟수 입력 및 방향 입력
    cin >> rotateCount;
    for(int i = 0; i < rotateCount; i++) {
        int geal_number, rotate_way;
        cin >> geal_number >> rotate_way;
        checkStatus(geal_number - 1, rotate_way);
        for(int i = 0 ; i < 4; i ++) {
            visited[i] = false;
        }
    }
    
    for(int i = 0; i < 4; i++) {
        if(cogwheel[i][0] == 1)
            answer += total_value;
        total_value *= 2;
    }
    cout << answer << endl;
    return 0;
}

문제 푼 소감

Soved.ac기준으로 Silver 1인데 Silver 1 같지 않은 느낌. 시뮬레이션 문제를 좀 더 풀어봐야 겠다.

Cloud computing 및 Infra 기초 정리

정보보호기사_정보보호관리의 개념 1