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

 

14891번: 톱니바퀴

총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴

www.acmicpc.net

 

문제는 길기 때문에 위 링크에서 확인하길 바란다.

 

풀이

입력이 string으로 주어진다. 톱니바퀴는 4개로 고정이므로 4개의 입력을 받고 K개의 회전을 입력받는다. 이때 회전하는 톱니의 왼쪽, 오른쪽을 구분하여 계산한다. 알고리즘의 동작 순서는 다음과 같다.

  • 돌리는 톱니의 왼쪽부터 확인한다.
  • 현재 톱니는 돌리는 톱니이다.
  • 만약 맞물리는 부분이 상극인 경우 현재 톱니를 어느 방향으로 돌리는지 배열에 표시하고 왼쪽 톱니가 현재 톱니가 된다.
  • 끝까지 가거나 맞물리는 부분이 상극이 아니어 회전하지 않을 때까지 반복한다.
  • 오른쪽 부분도 같은 과정을 진행한다.
  • 회전하는 방향을 표시해놓은 배열을 보며 톱니를 회전시킨다. 0인 경우 회전하지 않고 1인 경우 시계방향, -1인 경우 반시계방향으로 회전한다.
  • K번의 회전이 끝난 후 12시에 있는 극이 무엇인지 보고 결과값을 출력한다.

 

소스 코드

#include <iostream>
#include <string>
#include <cstring>
#include <vector>
#include <deque>

using namespace std;

const int MN = 101;
string wheel[5]; //1~4까지 톱니의 번호
int main() {
    cin >> wheel[1] >> wheel[2] >> wheel[3] >> wheel[4]; //4가지 톱니를 입력받음
    int K; cin >> K;
    int rotation[5]; //회전을 표시하는 배열
    for(int i = 0; i < K; i++) {
        memset(rotation, 0, sizeof(rotation)); //배열 초기화
        int num, direction; cin >> num >> direction;
        rotation[num] = direction; //현재 톱니의 회전 방향 체크
        //회전하는 톱니 왼쪽
        int now = num; //현재 톱니
        int nowd = direction; //현재 방향
        for(int w = num-1; w > 0; w--) {
            if(wheel[now][6] != wheel[w][2]) { //상극인 경우
                rotation[w] = -nowd; //반대 방향으로 회전 표시
                nowd = -nowd; //현재 방향 수정
                now--; //다음 톱니로 이동
            }
            else { //같은 극인 경우
                rotation[w] = 0; //회전하지 않는다고 표시 후 종료
                break;
            }
        }
        //회전하는 톱니 오른쪽
        now = num; //현재 톱니
        nowd = direction; //현재 방향
        for(int w = num+1; w <= 4; w++) {
            if(wheel[now][2] != wheel[w][6]) { //상극인 경우
                rotation[w] = -nowd; //반대 방향으로 회전 표시
                nowd = -nowd; //현재 방향 수정
                now++; //다음 톱니로 이동
            }
            else { //같은 극인 경우
                rotation[w] = 0; //회전하지 않는다고 표시 후 종료
                break;
            }
        }
        

        //톱니바퀴 회전시키기
        for(int j = 1; j <= 4; j++) {
            if(rotation[j] == 0) continue; //회전하지 않는 경우 건너뛰기
            if(rotation[j] == 1) { //시계방향으로 회전하는 경우
                string tmp = wheel[j].substr(0, 7);
                wheel[j] = wheel[j][7] + tmp;
            }
            else if(rotation[j] == -1) { //반시계방향으로 회전하는 경우
                string tmp = wheel[j].substr(1);
                wheel[j] = tmp + wheel[j][0];
            }
        }
    }
    //결과 계산
    int ans = 0;
    if(wheel[1][0] == '1') ans++; 
    if(wheel[2][0] == '1') ans +=2;
    if(wheel[3][0] == '1') ans += 4;
    if(wheel[4][0] == '1') ans += 8;

    cout << ans;
}

위 풀이를 그대로 구현한 코드이다.

 

채점 결과

+ Recent posts