톱니바퀴 [백준 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 같지 않은 느낌. 시뮬레이션 문제를 좀 더 풀어봐야 겠다.