ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준/BOJ] 14891번 톱니바퀴 (C++)
    알고리즘 문제풀이/백준 2020. 12. 5. 17:40

    www.acmicpc.net/problem/14891

     

    14891번: 톱니바퀴

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

    www.acmicpc.net

    삼성 역량 테스트 기출 문제 : 시뮬레이션(구현)

    특정 톱니바퀴를 움직였을 때 이에 인접해있는 톱니들이 움직이는지 안움직이는지, 움직인다면 어떤 방향으로 움직이는지를 처리하기가 어려웠던 문제였습니다. 이러한 체크를 먼저 하기 위해서 rotCheck 배열을 두어 특정 톱니바퀴를 움직일 때, 그 톱니바퀴의 왼쪽과 오른쪽을 각각 쭉 확인하여 왼쪽 톱니바퀴의 2번 인덱스와 오른쪽 톱니바퀴의 6번 인덱스가 같은지 확인하고, 다르다면 회전할 수 있으므로 회전 방향을 기록했습니다.

    톱니바퀴의 시계 방향, 반시계 방향 회전 처리는 다음과 같이 처리 했습니다.

     

    시계방향처리
    10101111 -> 11010111 뒤에 원소를 앞에다 넣어준다.

    반시계방향처리
    10101111 -> 01011111 앞에 원소를 뒤에다 넣어준다.

     

    #include <iostream>
    #include <vector>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    vector<string> gear(5);
    int rotCheck[5];
    int k, answer;
    
    // 점수를 계산하는 함수
    void getScore() {
        for(int i = 1; i <= 4; i++) {
            if(gear[i][0] == '1') {
                answer += (1 << i - 1);
            }
        }
    }
    
    // 톱니바퀴를 회전하는 함수
    void rotate() {
        for(int i = 1; i <= 4; i++) {
            // 시계 방향으로 회전
            if(rotCheck[i] == 1) {
                string tmp = "";
                tmp = gear[i].back();
                gear[i].insert(0, tmp);
                gear[i].pop_back();
            }
            
            // 반시계 방향으로 회전
            if(rotCheck[i] == -1) {
                char tmp = gear[i].front();
                gear[i].push_back(tmp);
                gear[i].erase(gear[i].begin());
            }
        }
    }
    
    // 톱니바퀴가 어느 방향으로 움직이는지 확인하는 함수
    void check(int target, int cmd) {
        rotCheck[target] = cmd;
        
        // 타겟으로부터 왼쪽 확인
        for(int left = target - 1; left >= 1; left--) {
            int right = left + 1;
            // 왼쪽 톱니바퀴의 2번 인덱스 == 오른쪽 톱니바퀴의 6번 인덱스면 움직이지 않음
            if(gear[left][2] == gear[right][6]) {
                break;
            }
            // 왼쪽 톱니바퀴의 2번 인덱스 != 오른쪽 톱니바퀴의 6번 인덱스면 반대 방향으로 움직임
            if(gear[left][2] != gear[right][6]) {
                rotCheck[left] = rotCheck[right] * -1;
            }
        }
        
        // 타겟으로부터 오른쪽 확인
        for(int right = target + 1; right <= 4; right++) {
            int left = right - 1;
            // 왼쪽 톱니바퀴의 2번 인덱스 == 오른쪽 톱니바퀴의 6번 인덱스면 움직이지 않음
            if(gear[left][2] == gear[right][6]) {
                break;
            }
            // 왼쪽 톱니바퀴의 2번 인덱스 != 오른쪽 톱니바퀴의 6번 인덱스면 반대 방향으로 움직임
            if(gear[left][2] != gear[right][6]) {
                rotCheck[right] = rotCheck[left] * -1;
            }
        }
    }
    
    int main(void) {
        ios_base::sync_with_stdio(false);
        cin.tie(0);
        
        for(int i = 1; i <= 4; i++) {
            cin>>gear[i];
        }
        
        cin>>k;
        while(k--) {
            int target, cmd;
            cin>>target>>cmd;
            check(target, cmd);
            rotate();
            memset(rotCheck, 0, sizeof(rotCheck));
        }
        
        getScore();
        cout<<answer;
    }

    댓글

Designed by Tistory.