728x90
반응형
https://www.acmicpc.net/problem/14891
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을 기록하는 개인 공부 블로그입니다.
내용 중 최적화가 가능한 부분등은 언제든지 댓글로 틀린 부분 및 피드백 주시면 공부 및 반영하겠습니다🧐
728x90
반응형
'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 |