> >
본문 바로가기

Algorithm/BOJ

[BOJ] 14891번 톱니바퀴

#include <bits/stdc++.h>
#define FASTIO ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
using namespace std;

int k, n, dir, res, cnt = 1;
string s[5];
bool flag[5];

void rev (int idx, int d){
    if (d == 1){
        int tmp = s[idx][7];
        for (int i = 7; i > 0; i--)
            s[idx][i] = s[idx][i - 1];
        s[idx][0] = tmp;
    }
    else{
        int tmp = s[idx][0];
        for (int i = 1; i < 8; i++)
            s[idx][i - 1] = s[idx][i];
        s[idx][7] = tmp;        
    }
}

int main(){
    FASTIO;
    
    for (int i = 1; i <= 4; i++) cin >> s[i];
    cin >> k;
    for (int i = 0; i < k; i++){
        memset(flag, 0, sizeof(flag));
        cin >> n >> dir;
        
        for (int j = n - 1; j >= 1; j--){
            if (s[j][2] != s[j + 1][6]) flag[j] = true;
            else break;
        }
        for (int j = n + 1; j <= 4; j++){
            if (s[j - 1][2] != s[j][6]) flag[j] = true;
        }
        
        rev(n, dir);
        int tmp = dir;
        for (int j = n - 1; j >= 1; j--){
            tmp *= -1;
            if (flag[j]) rev(j, tmp);
            else break;
        }
        for (int j = n + 1; j <= 4; j++){
            dir *= -1;
            if (flag[j]) rev(j, dir);
            else break;
        }
    }
    
    for (int i = 1; i <= 4; i++){
        if (s[i][0] == '1') res += cnt;
        cnt *= 2;
    }
    cout << res;
    return 0;
}

 

1. 돌아가는 톱니바퀴를 중심으로 flag를 확인한다.
2. 톱니바퀴에서 양쪽으로 rev를 돌린다.
3. 점수를 구한다.

 

팀원과 스터디를 하면서 rev함수를 새로운 배열을 만들어서 전달해주는 것도 깔끔하게 보기 좋은 것 같았다. 그리고 재귀적인 형태로 시작점을 중심으로 양쪽으로 호출해서 돌게하는 방법으로 구현할 수 있다는 것도 알았다.

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 14890번 경사로  (2) 2024.07.14
[BOJ] 14499번 주사위 굴리기  (1) 2024.07.14
[BOJ] 2504번 괄호의 값  (0) 2024.07.10
[BOJ] 18115번 카드 놓기  (0) 2024.07.10
[BOJ] 31802번 주기 함수 (Easy)  (0) 2024.07.10