본문 바로가기
algorithm

[algorithm] 백준 - 톱니바퀴

by 대우니 2020. 12. 24.
728x90
반응형

이 문제는 삼성 sw 기출 문제이다. 시뮬레이션 문제이다.

중첩 if문이 깊기 때문에 헷갈릴 수 있다는 것을 조심해야한다.

 

서로 맞닿은 톱니는 index로 표현하면 아래처럼 맞닿아있다.

 

 

A톱니바퀴가 회전할 때 서로 맞닿은 톱니의 극이 다르다면 A가 회전한 방향과 반대 방향으로 회전한다.

맞닿은 부분의 극이 같다면 회전하지 않는다.

N극은 0, S극은 1, 1은 시계방향, -1은 반시계방향이다.

 

1. 반시계방향 회전

뒤 index값을 앞 index에 대치한다.

그리고 맨 앞 index 값은 기록해두다가 맨 뒤 Index와 대치한다.

 

if(rotation == -1){
        char firstNum = saw[sawNum][0];
        for(int i = 0; i < 7; i++){
            saw[sawNum][i] = saw[sawNum][i+1];
        }
        saw[sawNum][7] = firstNum;
    }

 

2. 시계방향 회전

거꾸로 순환하면서 앞 index의 값을 뒤 index에 대치한다.

거꾸로 순환하지 않을 경우, 모든 수가 맨 앞 index의 값으로 대치되므로 주의해야한다.

그리고 맨 뒤 index 값은 기록해두다가 맨 앞 index와 대치한다.

else{
        char lastNum = saw[sawNum][7];
        for(int i = 6; i >= 0; i--){
            saw[sawNum][i + 1] = saw[sawNum][i];
        }
        saw[sawNum][0] = lastNum;
    }

 

회전하는 알고리즘을 구현했으니 톱니바퀴 번호 별로 회전 조건을 확인하여 회전시키는 로직을 구현해보자.

주의해야할 점은 회전하기 전의 톱니 값으로 비교해야한다는 것이다.

 

1과 4번 톱니바퀴에 경우,

1 -> 2 -> 3 -> 4 // 1번 톱니바퀴
4 -> 3 -> 2 -> 1 // 2번 톱니바퀴

순으로 톱니가 맞닿는지 확인하여 구현하는데, 

 

2와 3번 톱니바퀴는,

1 <- 2 -> 3 -> 4 // 2번 톱니바퀴
4 <- 3 -> 2 -> 1 // 3번 톱니바퀴

순으로 톱니가 맞닿는지 확인한다.

 

구현한 코드는 이렇다.

//톱니바퀴
#include <iostream>
using namespace std;

string saw[5];
int score[] = {0,1,2,4,8};
void rotateSaw(int sawNum, int rotation){
     if(rotation == -1){
        char firstNum = saw[sawNum][0];
    for(int i = 0; i < 7; i++){
        saw[sawNum][i] = saw[sawNum][i+1];
    }
    saw[sawNum][7] = firstNum;
    }
    else{
        char lastNum = saw[sawNum][7];
    for(int i = 6; i >= 0; i--){
        saw[sawNum][i + 1] = saw[sawNum][i];
    }
    saw[sawNum][0] = lastNum;
    }
}
void checkNeedRotationAndRotate(int sawNum, int rotation){
    if(sawNum == 1){
        int number = saw[1][2];
        rotateSaw(1,rotation);
        if(number != saw[2][6]){
            number = saw[2][2];
            rotateSaw(2, -1 * rotation);
            if(number != saw[3][6]){
                number = saw[3][2];
                rotateSaw(3, rotation);
                if(number != saw[4][6]){
                    rotateSaw(4, -1 *rotation);
                }
            }
        }
    }
    else if(sawNum == 2){
        int number = saw[2][6];
        int number2 = saw[2][2];
        rotateSaw(2, rotation);
        if(number != saw[1][2]){
            rotateSaw(1, -1 *rotation);
        }
        if(number2 != saw[3][6]){
            number = saw[3][2];
            rotateSaw(3, -1 * rotation);
            if(number != saw[4][6]){
                rotateSaw(4, rotation);
            }
        }
    }
    else if(sawNum == 3){
        int number = saw[3][6];
        int number2 = saw[3][2];
        rotateSaw(3,rotation);
        if(number2 != saw[4][6]){
            rotateSaw(4, -1 * rotation);
        }
        if(number != saw[2][2]){
            number = saw[2][6];
            rotateSaw(2, -1 * rotation);
            if(number != saw[1][2]){
                rotateSaw(1, rotation);
            }
        }
    }
    else{
        int number = saw[4][6];
        rotateSaw(4, rotation);
        if(number != saw[3][2]){
            number = saw[3][6];
            rotateSaw(3, -1 * rotation);
            if(number != saw[2][2]){
                number = saw[2][6];
                rotateSaw(2, rotation);
                if(number != saw[1][2]){
                    rotateSaw(1, -1 * rotation);
                }
            }
        }
    }
}
int getAnswer(){
    int answer = 0;
    for(int i = 1; i < 5; i++){
       answer += (saw[i][0] - '0') * score[i];
    }
    return answer;
}
int main(void){
    int count, sawNum, rotation;
    for(int i = 1; i < 5; i++){
        cin >> saw[i];
    }
    cin >> count;
    for(int i = 0; i < count; i++){
        cin >> sawNum >> rotation;   
        checkNeedRotationAndRotate(sawNum, rotation);
    }
    cout << getAnswer();
}
반응형

'algorithm' 카테고리의 다른 글

[algorithm] 백준 - 사다리 조작  (0) 2020.12.25
[algorithm] 백준 - 감시  (0) 2020.12.24
[algorithm] 백준 - 연구소  (0) 2020.12.24
[algorithm] 백준 - 경사로  (0) 2020.12.23
[algorithm] 백준 - 연산자 끼워넣기  (0) 2020.12.22