https://www.acmicpc.net/problem/14891
구현 문제다.
이전에 풀다가 실패한 문제다.
문제 설명
8개의 톱니로 이루어진 4개의 톱니바퀴가 존재한다.
이들은 서로 맞닿아 물려있고, 각 톱니에는 N극 혹은 S극이 존재한다.
하나의 톱니바퀴를 돌렸을 때, 다른 극 끼리 맞닿아 있다면 반대 방향으로 회전한다.
같은 극이 맞닿아 있다면 회전하지 않는다.
입력은 톱니바퀴의 톱니에 대한 정보가 들어오고, 회전 횟수, 회전 톱니와 방향이 들어온다.
풀이
우선 톱니바퀴 회전을 위해 벡터를 이용했다.
시계 방향 회전 시
arr[a].insert(arr[a].begin(), arr[a][7]);
arr[a].erase(arr[a].end() - 1);
반시계 방항 회전
arr[a].push_back(arr[a][0]);
arr[a].erase(arr[a].begin());
회전 톱니바퀴를 기준으로 왼쪽과 오른쪽을 나눠 진행했다.
내부 로직은 같으나 회전 여부를 판단하는 톱니가 다르다는 점이 다르다.
왼쪽 부분에서는 회전 톱니바퀴는 6번 톱니, 왼쪽 톱니바퀴는 2번 톱니를 비교한다.
오른쪽은 반대다.
이 때 회전 전의 톱니를 기준으로 비교해야 하므로 미리 변수에 저장해야 한다.
최종 코드
#include <iostream>
#include <vector>
using namespace std;
vector<int> arr[5];
int n;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
for (int i = 1; i < 5; i++) {
string s; cin >> s;
for (int j = 0; j < 8; j++) {
arr[i].push_back(s[j] - '0');
}
}
cin >> n;
while (n--) {
int a, b; cin >> a >> b;
int l = arr[a][6];
int r = arr[a][2];
int d = b;
if (b == 1) {
arr[a].insert(arr[a].begin(), arr[a][7]);
arr[a].erase(arr[a].end() - 1);
}
else {
arr[a].push_back(arr[a][0]);
arr[a].erase(arr[a].begin());
}
for (int i = a - 1; i > 0; i--) {
if (arr[i][2] == l) break;
l = arr[i][6];
if (d == -1) {
arr[i].insert(arr[i].begin(), arr[i][7]);
arr[i].erase(arr[i].end() - 1);
}
else {
arr[i].push_back(arr[i][0]);
arr[i].erase(arr[i].begin());
}
d = d == 1 ? -1 : 1;
}
d = b;
for (int i = a + 1; i < 5; i++) {
if (arr[i][6] == r) break;
r = arr[i][2];
if (d == -1) {
arr[i].insert(arr[i].begin(), arr[i][7]);
arr[i].erase(arr[i].end() - 1);
}
else {
arr[i].push_back(arr[i][0]);
arr[i].erase(arr[i].begin());
}
d = d == 1 ? -1 : 1;
}
}
int score[4] = { 1, 2, 4, 8 };
int res = 0;
for (int i = 0; i < 4; i++) {
if (arr[i + 1][0] == 1) res += score[i];
}
cout << res;
}
1년만에 다시 풀어보고 20분 만에 해결했다...ㅎㅎ
해당 코드는 약 70줄인데 이전 코드를 보니 알아볼 수도 없고 160줄 이상의 코드였다.
oOo
'Algorithm > Implementation' 카테고리의 다른 글
[C++] BOJ(백준) 1283 단축키 지정 (0) | 2024.06.22 |
---|---|
[C++] BOJ(백준) 1138 한 줄로 서기 (0) | 2024.06.22 |
[C++] BOJ(백준) 23031 으어어… 에이쁠 주세요.. (1) | 2024.02.13 |
[C++] BOJ(백준) 4920 테트리스 게임 (1) | 2024.02.09 |
[C++] BOJ(백준) 17144 미세먼지 안녕! (1) | 2024.02.08 |