본문 바로가기
🥇Baekjoon Solutions/삼성SW 기출

[C++] 백준 14891번: 톱니바퀴

by 코푸는 개발자 2022. 4. 28.
728x90

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

 

14891번: 톱니바퀴

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

www.acmicpc.net

문제풀이
톱나바퀴의 초기 상태와 톱니바퀴를 회전시킨 방법이 주어졌을 때, 최종 톱니바퀴의 상태를 구하기
톱니바퀴 회전 조건
1. 회전하는 톱니바퀴 기준으로 인접해 있는 톱니바퀴가 다른 극이라면 반대편 톱니바퀴 회전x(항상 기준은 회전하는 톱니바퀴에서 다음으로 오는 극을 기준으로함.)
2. 회전하는 톱니바퀴 기준 인접해 있는 톱니바퀴가 같은 극이라면 회전o

입력
첫 4줄 각 줄 별로 1,2,3,4번 톱니바퀴의 상태를 의미함(0:N극, 1:S극, 시작은 12시방향부터 시계방향으로 주어짐.)
다섯째 줄에는 회전 횟수 K(1~100)
다음 K개의 줄에는 회전 방법이 순서대로 주어진다.
첫번째 숫자는 회전시킨 톱니바퀴의 번호, 두번째 정수는 방향을 의미함(1:시계방향, -1:반시계방향)
 
출력
총 K번 회전시킨 이후에 네 톱니바퀴의 점수의 합을 출력(마지막 상태만 보고 점수를 출력함)
점수 계산
12시 방향이 S극이면 1번:1점, 2번:2점. 3번:4점, 4번:8번
나머지는 0점
1번 톱니바퀴 -> 3번째번호와 2번 톱니바퀴 7번째번호와 붙어있음
3번 톱니바퀴 -> 7번째번호와 2번 톱니바퀴 3번째번호, 4번 톱니바퀴 7번째 번호와 붙어있음
*주의 회전할 때 맞닿아 있는 기준으로 판단함.
#include <iostream>
#include <vector>

using namespace std;

string whleel[5];
int command[100][2];

//시계방향
void moveR(int n){
    int temp = whleel[n][7];

    for(int i = 7;i>=0;i--)
        whleel[n][i] = whleel[n][i-1];

    whleel[n][0] = temp;
}

//반시계방향
void moveL(int n){
    int temp = whleel[n][0];

    for(int i = 0;i<7;i++)
        whleel[n][i] = whleel[n][i+1];

    whleel[n][7] = temp;
}

void solve(int n, int d){

    if(n == 1){//1번 톱니바퀴가 돌아갈 경우
        if(d == 1){
            if(whleel[1][2] != whleel[2][6]){
                if(whleel[2][2] != whleel[3][6]){
                    if(whleel[3][2] != whleel[4][6])
                        moveL(4);
                    moveR(3);
                }
                moveL(2);
            }
            moveR(1);
        }
        else{
            if(whleel[1][2] != whleel[2][6]){
                if(whleel[2][2] != whleel[3][6]){
                    if(whleel[3][2] != whleel[4][6])
                        moveR(4);
                    moveL(3);
                }
                moveR(2);
            }
            moveL(1);
        }
    }
    else if(n == 2){//2번 톱니바퀴가 돌아갈 경우
        if(d == 1){
            if(whleel[1][2] != whleel[2][6])
                moveL(1);
            if(whleel[2][2] != whleel[3][6]){
                if(whleel[3][2] != whleel[4][6])
                    moveR(4);
                moveL(3);
            }
            moveR(2);
        }
        else{
            if(whleel[1][2] != whleel[2][6])
                moveR(1);
            if(whleel[2][2] != whleel[3][6]){
                if(whleel[3][2] != whleel[4][6])
                    moveL(4);
                moveR(3);
            }
            moveL(2);
        }
    }
    else if(n == 3){//3번 톱니바퀴가 돌아갈 경우
        if(d == 1){
            if(whleel[3][2] != whleel[4][6])
                moveL(4);
            if(whleel[2][2] != whleel[3][6]){
                if(whleel[1][2] != whleel[2][6])
                    moveR(1);
                moveL(2);
            }
            moveR(3);
        }
        else{
            if(whleel[3][2] != whleel[4][6])
                moveR(4);
            if(whleel[2][2] != whleel[3][6]){
                if(whleel[1][2] != whleel[2][6])
                    moveL(1);
                moveR(2);
            }
            moveL(3);
        }
    }
    else{//4번 톱니바퀴가 돌아갈 경우
        if(d == 1){
            if(whleel[3][2] != whleel[4][6]){
                if(whleel[2][2] != whleel[3][6]){
                    if(whleel[1][2] != whleel[2][6])
                        moveL(1);
                    moveR(2);
                }
                moveL(3);
            }
            moveR(4);
        }
        else{
            if(whleel[3][2] != whleel[4][6]){
                if(whleel[2][2] != whleel[3][6]){
                    if(whleel[1][2] != whleel[2][6])
                        moveR(1);
                    moveL(2);
                }
                moveR(3);
            }
            moveL(4);
        }
    }
}

int main(){

    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);

    int K, answer = 0;

    for(int i = 1; i<5; i++)
        cin >> whleel[i];

    cin>>K;

    for(int i = 0; i<K; i++){
        cin >> command[i][0];
        cin >> command[i][1];
    }

    //동작
    for(int i = 0; i<K; i++)
        solve(command[i][0], command[i][1]);

    //점수 계산
    if(whleel[1][0] == '1')
        answer += 1;
    if(whleel[2][0] == '1')
        answer += 2;
    if(whleel[3][0] == '1')
        answer += 4;
    if(whleel[4][0] == '1')
        answer += 8;

    cout << answer << '\n';

    return 0;
}

*조금 하드코딩한 느낌이 들긴하다...

조금 더 개선할 필요가 있어보인다.

728x90

댓글