GitHubSeob
C++ / 백준 / 14891 / 톱니바퀴 본문
문제 |
https://www.acmicpc.net/problem/14891
14891번: 톱니바퀴
첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터
www.acmicpc.net
문제풀이 |
톱니바퀴가 회전할 때는 처음 입력받은 톱니바퀴는 반드시 회전한다.
그다음 인접한 톱니바퀴는 회전하고 난 후가 아닌 회전하기 전의 기준 톱니바퀴와의 조건을 따져야 한다.
prev_gear와 gear를 따로 두어 조건을 따지는 톱니바퀴는 prev_gear를 이용하고, 회전을 할 때는 gear의 톱니바퀴를 회전하였다.
왼쪽 톱니바퀴의 [2]와 오른쪽 톱니바퀴의 [6]의 극을 따져야 한다.
극이 같다면, 톱니바퀴는 회전하지 않으므로 break를 통해 중단한다.
극이 다르다면, 톱니바퀴는 회전한다.
한번 회전하면 그다음 톱니바퀴는 반대방향으로 회전하므로 회전할 때마다 -1을 곱해줘야 한다.
void rotate(int loc, int dir) {
if (dir == 1) {
gear[loc].insert(0, 1, gear[loc].back());
gear[loc].erase(8, 1);
}
else if (dir == -1) {
gear[loc] += gear[loc][0];
gear[loc].erase(0, 1);
}
}
톱니바퀴를 회전시키는 함수이다.
톱니바퀴의 상태는 string형에 담겨있으므로 시계방향으로 회전할 때는 맨 앞에 맨뒤의 극을 삽입하고, 마지막 극을 삭제한다.
반시계방향으로 회전할 때는 맨뒤에 맨 앞의 극을 삽입하고, 맨 앞의 극을 삭제한다.
for (int idx = 0; idx < 4; ++idx) {
if (gear[idx][0] != '0') answer += score;
score *= 2;
}
마지막으로 점수를 매길 때는 톱니바퀴의 12시 방향인 [0]의 극만 확인하면 된다.
코드 |
#include <bits/stdc++.h>
using namespace std;
vector<string>gear(4);
vector<string>prev_gear(4);
void rotate(int loc, int dir) {
if (dir == 1) {
gear[loc].insert(0, 1, gear[loc].back());
gear[loc].erase(8, 1);
}
else if (dir == -1) {
gear[loc] += gear[loc][0];
gear[loc].erase(0, 1);
}
}
void left_gear(int num, int dir) {
for (int left = num - 1; left >= 0; --left) {
if (prev_gear[left][2] == prev_gear[left + 1][6]) break;
rotate(left, dir);
dir *= -1;
}
}
void right_gear(int num, int dir) {
for (int right = num + 1; right < 4; ++right) {
if (prev_gear[right - 1][2] == prev_gear[right][6]) break;
rotate(right, dir);
dir *= -1;
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
for (int idx = 0; idx < 4; ++idx) {
cin >> gear[idx];
prev_gear[idx] = gear[idx];
}
int K(0);
cin >> K;
int num(0), dir(0);
for (int idx = 0; idx < K; ++idx) {
cin >> num >> dir;
--num;
rotate(num, dir);
left_gear(num, dir * -1);
right_gear(num, dir * -1);
for (int idx2 = 0; idx2 < 4; ++idx2) {
prev_gear[idx2] = gear[idx2];
}
}
int answer(0), score(1);
for (int idx = 0; idx < 4; ++idx) {
if (gear[idx][0] != '0') answer += score;
score *= 2;
}
cout << answer;
}
'Baekjoon > Gold' 카테고리의 다른 글
C++ / 백준 / 1245 / 농장 관리 (0) | 2023.10.15 |
---|---|
C++ / 백준 / 13422 / 도둑 (0) | 2023.10.06 |
C++ / 백준 / 14500 / 테트로미노 (0) | 2023.09.21 |
C++ / 백준 / 13905 / 세부 (0) | 2023.09.21 |
C++ / 백준 / 2637 / 장난감 조립 (2) | 2023.09.09 |