https://www.acmicpc.net/problem/14891
14891번: 톱니바퀴
첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터
www.acmicpc.net
1. Logic
문제 요약 : 톱니바퀴와 맞닿아있는 톱니가 다른 극이면 톱니를 반대방향으로 움직이고 같은 극이면 톱니를 움직이지 않는다.
각 톱니별 부분 문제를 생각해보자면
회전방향 \ 톱니번호 | 1번 톱니 | 2번 톱니 | 3번 톱니 | 4번 톱니 |
시계방향 | 2번 > 반시계 3번 > 시계 4번 > 반시계 |
1번 > 반시계 3번 > 반시계 4번 > 시계 |
1번 > 시계 2번 > 반시계 4번 > 반시계 |
1번 > 반시계 2번 > 시계 3번 > 반시계 |
반 시계 방향 | 2번 > 시계 3번 > 반시계 4번 > 시계 |
1번 > 시계 3번 > 시계 4번 > 반시계 |
1번 > 반시계 2번 > 시계 4번 > 시계 |
1번 > 시계 2번 > 반시계 3번 > 시계 |
규칙은 돌리는 톱니의 방향이 반시계면 바로 맞닿아있는 톱니는 돌린 반대방향으로 돌아가고 맞닿아 있는 톱니와 붙어있는 톱니는 처음 돌린 톱니와 같은 방향으로 돌아간다.
하지만 여기서 주의해야 할 점이 있다. 1번과 4번 톱니는 맞닿아 있는 톱니가 안돌아가면 그 뒤의 톱니에 영향을 안주지만
2번과 3번 톱니는 2번 톱니를 예시를 들어보자면
2번과 맞닿아있는 1번 톱니가 안돌아간다해도 3번 톱니는 돌아갈 여지가 있기 때문에 영향을 전혀 안준다고 볼 수 없다.
그래서 밑에 코드를 보면 if문에 continue부분이 위의 예외상황을 처리해 준 부분이다.
2. Code
#include <iostream>
#include <queue>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
deque<char> gear1;
deque<char> gear2;
deque<char> gear3;
deque<char> gear4;
for(int i = 0; i < 4; i++) {
string str;
cin >> str;
for(int j = 0; j < 8; j++) {
if(i == 0) {
gear1.push_back(str[j]);
}
else if(i == 1) {
gear2.push_back(str[j]);
}
else if(i == 2) {
gear3.push_back(str[j]);
}
else if(i == 3) {
gear4.push_back(str[j]);
}
}
}
int n;
cin >> n;
for(int i = 0; i < n; i++) {
int gNum, type;
cin >> gNum >> type;
if(gNum == 1) {
if(type == 1) {
char prev2, prev6;
prev2 = gear1[2];
prev6 = gear1[6];
gear1.push_front(gear1.back());
gear1.pop_back();
if(prev2 != gear2[6]){
prev2 = gear2[2];
prev6 = gear2[6];
gear2.push_back(gear2.front());
gear2.pop_front();
} else continue;
if(prev2 != gear3[6]){
prev2 = gear3[2];
prev6 = gear3[6];
gear3.push_front(gear3.back());
gear3.pop_back();
} else continue;
if(prev2 != gear4[6]){
prev2 = gear4[2];
prev6 = gear4[6];
gear4.push_back(gear4.front());
gear4.pop_front();
} else continue;
}
else if(type == -1) {
char prev2, prev6;
prev2 = gear1[2];
prev6 = gear1[6];
gear1.push_back(gear1.front());
gear1.pop_front();
if(prev2 != gear2[6]){
prev2 = gear2[2];
prev6 = gear2[6];
gear2.push_front(gear2.back());
gear2.pop_back();
} else continue;
if(prev2 != gear3[6]){
prev2 = gear3[2];
prev6 = gear3[6];
gear3.push_back(gear3.front());
gear3.pop_front();
} else continue;
if(prev2 != gear4[6]){
prev2 = gear4[2];
prev6 = gear4[6];
gear4.push_front(gear4.back());
gear4.pop_back();
} else continue;
}
}
else if(gNum == 2) {
if(type == 1) {
char prev2, prev6;
prev2 = gear2[2];
prev6 = gear2[6];
gear2.push_front(gear2.back());
gear2.pop_back();
if(prev6 != gear1[2]){
gear1.push_back(gear1.front());
gear1.pop_front();
}
if(prev2 != gear3[6]){
prev2 = gear3[2];
prev6 = gear3[6];
gear3.push_back(gear3.front());
gear3.pop_front();
} else continue;
if(prev2 != gear4[6]){
prev2 = gear4[2];
prev6 = gear4[6];
gear4.push_front(gear4.back());
gear4.pop_back();
}
}
else if(type == -1) {
char prev2, prev6;
prev2 = gear2[2];
prev6 = gear2[6];
gear2.push_back(gear2.front());
gear2.pop_front();
if(prev6 != gear1[2]){
gear1.push_front(gear1.back());
gear1.pop_back();
}
if(prev2 != gear3[6]){
prev2 = gear3[2];
prev6 = gear3[6];
gear3.push_front(gear3.back());
gear3.pop_back();
} else continue;
if(prev2 != gear4[6]){
prev2 = gear4[2];
prev6 = gear4[6];
gear4.push_back(gear4.front());
gear4.pop_front();
}
}
}
else if(gNum == 3) {
if(type == 1) {
char prev2, prev6;
prev2 = gear3[2];
prev6 = gear3[6];
gear3.push_front(gear3.back());
gear3.pop_back();
if(prev2 != gear4[6]){
gear4.push_back(gear4.front());
gear4.pop_front();
}
if(prev6 != gear2[2]){
prev2 = gear2[2];
prev6 = gear2[6];
gear2.push_back(gear2.front());
gear2.pop_front();
} else continue;
if(prev6 != gear1[2]){
gear1.push_front(gear1.back());
gear1.pop_back();
}
}
else if(type == -1) {
char prev2, prev6;
prev2 = gear3[2];
prev6 = gear3[6];
gear3.push_back(gear3.front());
gear3.pop_front();
if(prev2 != gear4[6]){
gear4.push_front(gear4.back());
gear4.pop_back();
}
if(prev6 != gear2[2]){
prev2 = gear2[2];
prev6 = gear2[6];
gear2.push_front(gear2.back());
gear2.pop_back();
} else continue;
if(prev6 != gear1[2]){
gear1.push_back(gear1.front());
gear1.pop_front();
}
}
}
else if(gNum == 4) {
if(type == 1) {
char prev2, prev6;
prev2 = gear4[2];
prev6 = gear4[6];
gear4.push_front(gear4.back());
gear4.pop_back();
if(prev6 != gear3[2]){
prev2 = gear3[2];
prev6 = gear3[6];
gear3.push_back(gear3.front());
gear3.pop_front();
} else continue;
if(prev6 != gear2[2]){
prev2 = gear2[2];
prev6 = gear2[6];
gear2.push_front(gear2.back());
gear2.pop_back();
} else continue;
if(prev6 != gear1[2]){
prev2 = gear1[2];
prev6 = gear1[6];
gear1.push_back(gear1.front());
gear1.pop_front();
}
}
else if(type == -1) {
char prev2, prev6;
prev2 = gear4[2];
prev6 = gear4[6];
gear4.push_back(gear4.front());
gear4.pop_front();
if(prev6 != gear3[2]){
prev2 = gear3[2];
prev6 = gear3[6];
gear3.push_front(gear3.back());
gear3.pop_back();
} else continue;
if(prev6 != gear2[2]){
prev2 = gear2[2];
prev6 = gear2[6];
gear2.push_back(gear2.front());
gear2.pop_front();
} else continue;
if(prev6 != gear1[2]){
prev2 = gear1[2];
prev6 = gear1[6];
gear1.push_front(gear1.back());
gear1.pop_back();
}
}
}
}
int ans = gear1[0]-'0' + (gear2[0]-'0')*2 + (gear3[0]-'0')*4 + (gear4[0]-'0')*8;
cout << ans;
}
3. Feedback
다른 풀이를 보면 vector 컨테이너에 deque를 넣어서 for문을 돌려서 했는데 훨씬 코드가 간결해지긴 한다.
내코드 : 8067Byte > for문 사용 코드 : 1100 ~ 2000Byte
확실히 짧아지긴 하지만 문제를 보자마자 for문을 사용한 코드가 떠오를지가 의문이다..
조금 더 열심히 여러방면으로 사고하는 힘을 길러봐야겠다!
내 힘으로 솔브했으니 그래도 만족!!! 하지말고 열심히 해라 이정환
알고리즘 Solve 후 제가 생각한 Logic을 기록하는 개인 공부 블로그입니다.
내용 중 최적화가 가능한 부분등은 언제든지 댓글로 틀린 부분 및 피드백 주시면 공부 및 반영하겠습니다🧐
'Algorithm > Beakjoon' 카테고리의 다른 글
[백준/Baekjoon] 2240 자두나무 C++ :: Dynamic Programming (0) | 2023.11.10 |
---|---|
[백준/Baekjoon] 1138 한 줄로 서기 C++ :: Implementation & Greedy (0) | 2023.11.09 |
[백준/Baekjoon] 2563 색종이 C++ :: Implementation (0) | 2023.11.07 |
[백준/Baekjoon] 2012 등수 매기기 C++ :: Greedy (0) | 2023.11.07 |
[백준/Baekjoon] 1992 쿼드트리 C++ :: Divide and conquer (1) | 2023.11.04 |