알고리즘/acmicpc

[백준][14891번] 톱니바퀴 [cpp, c++]

장그래 2020. 1. 18. 23:13
반응형

백준 14891번 톱니바퀴

  • 전형적인 시뮬레이션 문제이다.
    2차원 배열을 더 쓰면 간단하게 할 수 있지만, 4개 밖에 되지 않아 하드 코딩했다.
  • https://www.acmicpc.net/problem/14891
 

14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터 시계방향 순서대로 주어진다. N극은 0, S극은 1로 나타나있다. 다섯째 줄에는 회전 횟수 K(1 ≤ K ≤ 100)가 주어진다. 다음 K개 줄에는 회전시킨 방법이 순서대로 주어진다. 각 방법은 두 개의 정수로 이루어져 있고, 첫 번째 정수는 회전시킨 톱니바퀴

www.acmicpc.net

  • 풀이방법
    1) 시계 방향으로 회전하는 함수 구현, 반시계 방향으로 회전하는 함수 구현
    2) 입력 받은 톱니바퀴 기준으로 어느 방향으로 돌아야 하는지 check
    3) check 배열을 기준으로 회전

  • 함수 설명
    1) right_rotate(char arr[]), left_rotate(char arr[]) : 시계, 반시계 회전 함수
    2) check_direction(int gear, int direct) : 입력받은 톱니바퀴 번호와, 방향을 기준으로 check 배열에 값 넣음
    3) move_gear(): check 배열을 기준으로 톱니바퀴 이동


#include<iostream>
#include<cstdlib>
#include<vector>
#include<algorithm>
#include<string.h>
#include<queue>

using namespace std;
char gear1[9], gear2[9], gear3[9], gear4[9];
int check[5];
int K;
int ans;

void right_rotate(char arr[]) { //시계방향으로 회전 1
    char temp = arr[7];
    for (int i = 7; i > 0; i--) arr[i] = arr[i - 1];
    arr[0] = temp;
}

void left_rotate(char arr[]) { //시계방향으로 회전 1
    char temp = arr[0];
    for (int i = 0; i < 7; i++) arr[i] = arr[i+1];
    arr[7] = temp;
}

void check_direction(int gear, int direct) {
    if (gear == 1) {
        check[1] = direct;
        if (gear1[2] != gear2[6]) check[2] = (check[1]*-1);
        if (check[2]!=0 && gear2[2] != gear3[6]) check[3] = (check[2]*-1);
        if (check[3] != 0 && gear3[2] != gear4[6]) check[4] = (check[3]*-1);
    }
    else if (gear == 2) {
        check[2] = direct;
        if (gear1[2] != gear2[6]) check[1] = (check[2] * -1);
        if (gear2[2] != gear3[6]) check[3] = (check[2] * -1);
        if (check[3]!=0 && gear3[2] != gear4[6]) check[4] = (check[3] * -1);
    }
    else if (gear == 3) {
        check[3] = direct;
        if (gear3[2] != gear4[6]) check[4] = (check[3] * -1);
        if (gear2[2] != gear3[6]) check[2] = (check[3] * -1);
        if (check[2] !=0 && gear1[2] != gear2[6]) check[1] = (check[2] * -1);    
    }
    else if (gear == 4) {
        check[4] = direct;
        if (gear3[2] != gear4[6]) check[3] = (check[4] * -1);
        if (check[3] != 0 && (gear2[2] != gear3[6])) check[2] = (check[3] * -1);
        if (check[2] !=0 && (gear1[2] != gear2[6])) check[1] = (check[2] * -1);


    }
}

void move_gear() {
    if (check[1] == 1) right_rotate(gear1);
    else if (check[1] == -1) left_rotate(gear1);

    if (check[2] == 1) right_rotate(gear2);
    else if (check[2] == -1) left_rotate(gear2);

    if (check[3] == 1) right_rotate(gear3);
    else if (check[3] == -1) left_rotate(gear3);

    if (check[4] == 1) right_rotate(gear4);
    else if (check[4] == -1) left_rotate(gear4);
}

void sol() {
    ans = gear1[0] - '0' + ((gear2[0] - '0') * 2) + ((gear3[0] - '0') * 4) + ((gear4[0] - '0') * 8);
    cout << ans;

}

int main(void) {
    for (int i = 0; i < 8; i++) cin >> gear1[i];
    for (int i = 0; i < 8; i++) cin >> gear2[i];
    for (int i = 0; i < 8; i++) cin >> gear3[i];
    for (int i = 0; i < 8; i++) cin >> gear4[i];
    cin >> K;
    int num1, num2;
    for (int i = 0; i < K; i++) {
        cin >> num1 >> num2;
        check_direction(num1, num2);
        move_gear();
        memset(check, 0, sizeof(check));
    }
    sol();

}

반응형