티스토리 뷰

반응형

https://www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터

www.acmicpc.net

 

  • 문제 해결 방법

나머지 연산을 잘 이용하면 문제를 쉽게 해결할 수 있습니다.

아래의 그림은 톱니바퀴의 시계방향 회전과 그 상태정보를 0~7인덱스로 나타낸 그림입니다.

톱니바퀴의 시계방향 회전

위 그림과 같이 톱니바퀴의 상태정보를 0~7로 인덱싱하고 12시방향의 상태정보 인덱스를 now라고 한다면,비교해야 할 위치는 다음과 같습니다.

 

오른쪽과 맞닿은 톱니바퀴 인덱스 = (now+2)%8

왼쪽과 맞닿은 톱니바퀴 인덱스    = (now+8-2)%8

(왼쪽 인덱스에서 (+8-2)를 해주는 이유는 %연산시 피연산자가 음수일때 기대와는 다른 값이 나올 수 있기 때문)

 

위와 같이 정의했다면 톱니바퀴들의 상태정보를 비교하여 움직여야 할 톱니바퀴가 몇개인지 구할 수 있습니다.

시계방향으로 움직인다면 12시방향 인덱스(now)에 -1을 해주고 반시계방향으로 움직인다면 now에 +1을 해주면 됩니다.

 

 

  • C++ 전체 코드
#include<bits/stdc++.h>
using namespace std;

int N,M;
int m[4][8]{};
int now[4]{};

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    string str;
    for(int i=0; i<4; i++){
        cin>>str;
        for(int j=0; j<8; j++) 
            m[i][j] = str[j]-'0';
    }

    cin>>M;
    int a,b;
    for(int i=0; i<M; i++){
        cin>>a>>b; 
        a--; // 톱니바퀴 인덱스 0부터
        
	// 움직여야할 톱니바퀴 개수 탐색 ( l번~ r번 )
        int l=a, r=a;
        for(int j=a-1; j>=0; j--){
        	// XOR 연산자로 왼쪽, 오른쪽 상태정보를 확인
            if(m[j][(now[j]+2)%8] ^ m[j+1][(now[j+1]+6)%8]) l--;
            else break;
        }
        for(int j=a+1; j<4; j++){
        	// XOR 연산자로 왼쪽, 오른쪽 상태정보를 확인
            if(m[j][(now[j]+6)%8] ^ m[j-1][(now[j-1]+2)%8]) r++;
            else break;
        }
        
        if(!((a-l)%2)) b *= -1;
        for(int k=l; k<=r; k++){
            now[k] = (now[k]+8+b)%8;
            b *= -1;
        }
    }

    int res = 0, power = 1;
    for(int i=0; i<4; i++){
        res += (m[i][now[i]] * power);
        power*=2;
    }
    cout<<res;
}

 

반응형

'알고리즘 공부 > 문제풀이' 카테고리의 다른 글

백준 10775번 - 공항  (0) 2021.05.21
백준 16345번 - 인구 이동  (0) 2021.05.20
백준 21277번 - 짠돌이 호석  (0) 2021.05.18
백준 16174번 - 점프왕 쩰리 (Large)  (0) 2021.05.18
백준 5397번 - 키로커  (0) 2021.05.18
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함