[백준 14891번 C/C++] 톱니바퀴
[백준 14891번 C/C++] 톱니바퀴
https://www.acmicpc.net/problem/14891
14891번: 톱니바퀴
첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터
www.acmicpc.net
해결방안
구현
#include<algorithm>
- rotate(v.begin(), v.begin() + 1, v.end());
- 왼쪽 회전
- rotate(v.begin(), v.end() - 1, v.end());
- 오른쪽 회전
코드
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int k, input, rDir;
string inputNumber;
vector<int> v1, v2, v3, v4;
void Rotate(vector<int>& v, int dir)
{
if (dir == -1)
{
rotate(v.begin(), v.begin() + 1, v.end());
return;
}
else if (dir == 1)
{
rotate(v.begin(), v.end() - 1, v.end());
return;
}
else
return;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
v1.resize(8);
v2.resize(8);
v3.resize(8);
v4.resize(8);
cin >> inputNumber;
for (int i = 0; i < 8; i++) {
v1[i] = inputNumber[i] - '0';
}
cin >> inputNumber;
for (int i = 0; i < 8; i++) {
v2[i] = inputNumber[i] - '0';
}
cin >> inputNumber;
for (int i = 0; i < 8; i++) {
v3[i] = inputNumber[i] - '0';
}
cin >> inputNumber;
for (int i = 0; i < 8; i++) {
v4[i] = inputNumber[i] - '0';
}
cin >> k;
for (int i = 0; i < k; i++) {
cin >> input;
if (input == 1) {
cin >> rDir;
if (v1[2] != v2[6] && v2[2] != v3[6] && v3[2] != v4[6])
{
Rotate(v1, rDir);
Rotate(v2, -rDir);
Rotate(v3, rDir);
Rotate(v4, -rDir);
}
else if (v1[2] != v2[6] && v2[2] != v3[6] && v3[2] == v4[6])
{
Rotate(v1, rDir);
Rotate(v2, -rDir);
Rotate(v3, rDir);
}
else if (v1[2] != v2[6] && v2[2] == v3[6])
{
Rotate(v1, rDir);
Rotate(v2, -rDir);
}
else if (v1[2] == v2[6])
Rotate(v1, rDir);
}
else if (input == 2) {
cin >> rDir;
if (v1[2] != v2[6] && v2[2] != v3[6] && v3[2] != v4[6])
{
Rotate(v1, -rDir);
Rotate(v2, rDir);
Rotate(v3, -rDir);
Rotate(v4, rDir);
}
else if (v1[2] != v2[6] && v2[2] != v3[6] && v3[2] == v4[6])
{
Rotate(v1, -rDir);
Rotate(v2, rDir);
Rotate(v3, -rDir);
}
else if (v1[2] != v2[6] && v2[2] == v3[6])
{
Rotate(v1, -rDir);
Rotate(v2, rDir);
}
else if (v1[2] == v2[6] && v2[2] != v3[6] && v3[2] != v4[6])
{
Rotate(v2, rDir);
Rotate(v3, -rDir);
Rotate(v4, rDir);
}
else if (v1[2] == v2[6] && v2[2] != v3[6] && v3[2] == v4[6])
{
Rotate(v2, rDir);
Rotate(v3, -rDir);
}
else if (v1[2] == v2[6] && v2[2] == v3[6])
{
Rotate(v2, rDir);
}
}
else if (input == 3) {
cin >> rDir;
if (v1[2] != v2[6] && v2[2] != v3[6] && v3[2] != v4[6])
{
Rotate(v1, rDir);
Rotate(v2, -rDir);
Rotate(v3, rDir);
Rotate(v4, -rDir);
}
else if (v1[2] == v2[6] && v2[2] != v3[6] && v3[2] != v4[6])
{
Rotate(v2, -rDir);
Rotate(v3, rDir);
Rotate(v4, -rDir);
}
else if (v1[2] != v2[6] && v2[2] != v3[6] && v3[2] == v4[6])
{
Rotate(v1, rDir);
Rotate(v2, -rDir);
Rotate(v3, rDir);
}
else if (v1[2] == v2[6] && v2[2] != v3[6] && v3[2] == v4[6])
{
Rotate(v2, -rDir);
Rotate(v3, rDir);
}
else if (v2[2] == v3[6] && v3[2] != v4[6])
{
Rotate(v3, rDir);
Rotate(v4, -rDir);
}
else if (v2[2] == v3[6] && v3[2] == v4[6])
{
Rotate(v3, rDir);
}
}
else if (input == 4) {
cin >> rDir;
if (v3[2] != v4[6] && v2[2] != v3[6] && v1[2] != v2[6])
{
Rotate(v4, rDir);
Rotate(v3, -rDir);
Rotate(v2, rDir);
Rotate(v1, -rDir);
}
else if (v3[2] != v4[6] && v2[2] != v3[6] && v1[2] == v2[6])
{
Rotate(v4, rDir);
Rotate(v3, -rDir);
Rotate(v2, rDir);
}
else if (v3[2] != v4[6] && v2[2] == v3[6])
{
Rotate(v4, rDir);
Rotate(v3, -rDir);
}
else if (v3[2] == v4[6])
Rotate(v4, rDir);
}
}
cout << v1[0] + v2[0] * 2 + v3[0] * 4 + v4[0] * 8;
return 0;
}
더 나은 풀이
BFS를 활용한 풀이
다른 사람의 해설참조
https://www.acmicpc.net/source/62886223
로그인
www.acmicpc.net
https://www.acmicpc.net/source/44445769
로그인
www.acmicpc.net
'⭐ 코딩테스트 > 백준' 카테고리의 다른 글
[백준 1780번 C/C++] 종이의 개수 (0) | 2023.07.05 |
---|---|
[백준 1992번 C/C++] 쿼드트리 (0) | 2023.07.04 |
[백준 11279번 C/C++] 최대 힙 (0) | 2023.07.03 |
[백준 10866번 C/C++] 덱 (0) | 2023.07.01 |
[백준 2805번 C/C++] 나무 자르기 (0) | 2023.06.27 |
댓글
이 글 공유하기
다른 글
-
[백준 1780번 C/C++] 종이의 개수
[백준 1780번 C/C++] 종이의 개수
2023.07.05 -
[백준 1992번 C/C++] 쿼드트리
[백준 1992번 C/C++] 쿼드트리
2023.07.04 -
[백준 11279번 C/C++] 최대 힙
[백준 11279번 C/C++] 최대 힙
2023.07.03 -
[백준 10866번 C/C++] 덱
[백준 10866번 C/C++] 덱
2023.07.01