문제 : https://www.acmicpc.net/problem/14891
[ 알고리즘풀이 ]
1. 톱니바퀴의 상태를 12시부터 시계방향으로 배열에 저장합니다.
( chain[a][b] : a번 톱니바퀴의 12시 시계방향 기준으로 b번 째 톱니 )
2. 입력된 회전 명령에 의해 회전되는 톱니바퀴들을 check 해야합니다.
direction[ ] 배열을 선언해, i번 톱니바퀴가 회전을 해야 되는지, 해야 한다면 시계방향인지 반시계 방향인지 저장합니다.
이때, a번 톱니바퀴가 b( 시계방향이면1, 반시계 방향이면 -1)로 회전해야 한다면 (a + 1)번 톱니바퀴는 a번과 맞닿는 부분에 따라서 회전해야 한다면 -b 방향으로 회전해야 합니다.
// 오른쪽 check.
for (int i = a; i < 4; i++)
if (chain[i][2] != chain[i + 1][6])
direction[i + 1] = -direction[i];
// 왼쪽 check.
for (int i = a; i > 1; i--) {
if (chain[i][6] != chain[i - 1][2])
direction[i - 1] = -direction[i];
}
즉, 다음과 같이 a번 톱니바퀴에서 오른쪽으로 체크, 왼쪽으로 체크해서 direction[ ] 배열을 채워나갈 수 있습니다.
3. direction[ ] 배열을 통해 우리는 몇 번 톱니바퀴를 어떻게 회전해야 되는지 알 수 있으므로, turn 함수를 통해 톱니바퀴를 돌려줍니다.
4. 2~3 과정을 반복해 모든 회전 명령을 다 수행했다면 점수를 계산해주면 됩니다.
#include<iostream>
#include<string>
using namespace std;
int chain[5][8] = {}, t, a, b;
string input;
void turn(int a, int dir) {
int temp;
if(dir == 1){
temp = chain[a][7];
for (int i = 7; i > 0; i--)
chain[a][i] = chain[a][i - 1];
chain[a][0] = temp;
}
else {
temp = chain[a][0];
for (int i = 0; i < 7; i++)
chain[a][i] = chain[a][i + 1];
chain[a][7] = temp;
}
return;
}
int getScore(void) {
int ans = 0, mul = 1;
for (int i = 1; i <= 4; i++){
if (chain[i][0] == 1)
ans += mul;
mul *= 2;
}
return ans;
}
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
for (int i = 1; i <= 4; i++) {
cin >> input;
for (int j = 0; j < 8; j++)
chain[i][j] = (input[j] - '0');
}
cin >> t;
while (t--) {
cin >> a >> b;
// 1-2 2-3 3-4 톱니바퀴가 회전해야되는지 체크.
int direction[5] = {};
direction[a] = b;
// 오른쪽 check.
for (int i = a; i < 4; i++)
if (chain[i][2] != chain[i + 1][6])
direction[i + 1] = -direction[i];
// 왼쪽 check.
for (int i = a; i > 1; i--) {
if (chain[i][6] != chain[i - 1][2])
direction[i - 1] = -direction[i];
}
for (int i = 1; i < 5; i++) {
if (direction[i])
turn(i, direction[i]);
}
}
cout << getScore() << '\n';
return 0;
}
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ] 1074 : Z - travelbeeee (0) | 2020.02.19 |
---|---|
[BOJ] 1124 : 언더프라임 - travelbeeee (0) | 2020.02.19 |
[BOJ] 1500 :최대 곱 -travelbeeee (0) | 2020.02.19 |
[BOJ] 1431 : 시리얼 번호 - travelbeeee (0) | 2020.02.18 |
[BOJ] 17406 : 배열 돌리기 4 - travelbeeee (0) | 2020.02.18 |