문제
풀이
구현, 시뮬레이션
현재 order에서 움직일 기어들을 찾아서 방향에 맞게 회전시켜야 한다. 현재 order 기어의 오른쪽 기어들과 왼쪽 기어들을 나눠서 생각한다.
// 현재 기어의 오른쪽 기어들 탐색
for (int current_gear = order_gear + 1; current_gear < 4; ++current_gear)
{
// 현재 기어와 현재 기어 바로 왼쪽 기어의 상태를 비교
if (gear[current_gear - 1][2] != gear[current_gear][6])
{
// 돌릴 방향은 현재 기어와의 위치에 따라 다르다.
if ((order_gear + current_gear) % 2 == 0)
{
move_gear.push_back(make_pair(current_gear, order_dir));
}
else
{
move_gear.push_back(make_pair(current_gear, (-1) * order_dir));
}
}
else
{
// 현재 기어가 돌아가지 않는다면 현재 기어 + 1번 기어도 돌아가지 않는다.
break;
}
}
오른쪽 기어들을 탐색하는 경우, 현재 기어의 바로 왼쪽 기어와 상태를 비교한다. 현재기어의 6번 상태와 왼쪽 기어의 2번 상태를 비교하여, 서로 맞지 않다면 움직일 기어로 들어간다. 움직이는 방향은 order 기어의 위치와 방향에 따라 다르다. 현재 기어가 order 기어와의 차이가 홀수라면 서로 다른 방향으로 돌아가고, 짝수라면 같은 방향으로 돌아간다.
order 기어의 왼쪽 기어들도 같은 방식으로 움직일 기어를 찾는다.
코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int gear[4][8];
pair<int, int> order[100];
// 기어 회전
void rotateGear(int num, int dir)
{
if (dir == 1)
{
int temp = gear[num][7];
for (int i = 7; i > 0; --i)
{
gear[num][i] = gear[num][i - 1];
}
gear[num][0] = temp;
}
else
{
int temp = gear[num][0];
for (int i = 0; i < 7; ++i)
{
gear[num][i] = gear[num][i + 1];
}
gear[num][7] = temp;
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(NULL);
cout.tie(NULL);
int K;
for (int i = 0; i < 4; ++i)
{
string temp;
cin >> temp;
for (int j = 0; j < 8; ++j)
{
gear[i][j] = temp[j] - '0';
}
}
cin >> K;
for (int i = 0; i < K; ++i)
{
cin >> order[i].first >> order[i].second;
order[i].first--;
}
for (int i = 0; i < K; ++i)
{
int order_gear = order[i].first;
int order_dir = order[i].second;
// 현재 order에서 회전시킬 기어들
vector<pair<int, int>> move_gear;
move_gear.push_back(make_pair(order_gear, order_dir));
// 현재 기어의 오른쪽 기어들 탐색
for (int current_gear = order_gear + 1; current_gear < 4; ++current_gear)
{
// 현재 기어와 현재 기어 바로 왼쪽 기어의 상태를 비교
if (gear[current_gear - 1][2] != gear[current_gear][6])
{
// 돌릴 방향은 현재 기어와의 위치에 따라 다르다.
if ((order_gear + current_gear) % 2 == 0)
{
move_gear.push_back(make_pair(current_gear, order_dir));
}
else
{
move_gear.push_back(make_pair(current_gear, (-1) * order_dir));
}
}
else
{
// 현재 기어가 돌아가지 않는다면 현재 기어 + 1번 기어도 돌아가지 않는다.
break;
}
}
// 현재 기어의 왼쪽 기어들 탐색
for (int current_gear = order_gear - 1; current_gear >= 0; --current_gear)
{
// 현재 기어와 현재 기어 바로 오른쪽 기어의 상태를 비교
if (gear[current_gear + 1][6] != gear[current_gear][2])
{
// 돌릴 방향은 현재 기어와의 위치에 따라 다르다.
if ((order_gear + current_gear) % 2 == 0)
{
move_gear.push_back(make_pair(current_gear, order_dir));
}
else
{
move_gear.push_back(make_pair(current_gear, (-1) * order_dir));
}
}
else
{
break;
}
}
for (int j = 0; j < move_gear.size(); ++j)
{
rotateGear(move_gear[j].first, move_gear[j].second);
}
}
int answer = 0;
int temp = 1;
for (int i = 0; i < 4; ++i)
{
answer += gear[i][0] * temp;
temp *= 2;
}
cout << answer;
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준][C++] 3036: 링 (0) | 2024.01.15 |
---|---|
[백준][C++] 1735: 분수 합 (0) | 2024.01.14 |
[백준][C++] 16235: 인구 이동 (1) | 2024.01.10 |
[백준][C++] 14499: 주사위 굴리기 (1) | 2024.01.09 |
[백준][C++] 17406: 배열 돌리기 4 (1) | 2024.01.08 |