티스토리 뷰

반응형
백준 14891번: 톱니바퀴 (C++) 문제 풀이

백준 14891번 톱니바퀴 C++ 풀이 정리


문제 설명


백준 14891번 톱니바퀴 문제는 4개의 톱니바퀴가 주어지고, 각각 8개의 톱니(극: N=0, S=1)로 구성되어 있을 때, 주어진 회전 명령에 따라 톱니들이 어떻게 움직이는지를 시뮬레이션한 뒤 최종 점수를 계산하는 문제입니다.



핵심 규칙


  • 회전 명령을 받은 톱니는 무조건 회전합니다.
  • 인접한 톱니는 서로 맞닿은 극이 다르면 반대 방향으로 회전합니다.
  • 맞닿은 극이 같으면 그쪽 전파는 멈춥니다.
  • 최종 점수는 다음과 같이 계산됩니다.
    • 1번 톱니의 12시 방향이 S극 → +1점
    • 2번 톱니의 12시 방향이 S극 → +2점
    • 3번 톱니의 12시 방향이 S극 → +4점
    • 4번 톱니의 12시 방향이 S극 → +8점


접근 방법


  • 각 톱니 상태를 char[8] 배열로 저장합니다.
  • ClockWise, CounterWise 함수를 따로 만들어서 배열을 한 칸씩 회전시킵니다.
  • 인접 톱니 비교는 1-2, 2-3, 3-4 세 구간만 확인하면 됩니다.
    • 왼쪽 톱니의 2번 인덱스
    • 오른쪽 톱니의 6번 인덱스
  • 회전 전, 비교할 맞닿은 톱니 상태를 모두 저장해 두고(arr[0]~arr[5]), 전파 여부를 check[4] 배열로 관리합니다.
  • check[i] = 1 → 시계 방향, check[i] = -1 → 반시계 방향, check[i] = 0 → 회전 없음.


사용 코드


#include <iostream>
#include <cmath>
using namespace std;

void ClockWise(char* arr) {
    char prev = arr[0], next;
    for (int i = 1; i < 8; i++) {
        next = arr[i];
        arr[i] = prev;
        prev = next;
    }
    arr[0] = prev;
}
void CounterWise(char* arr) {
    char prev = arr[7], next;
    for (int i = 6; i >= 0; i--) {
        next = arr[i];
        arr[i] = prev;
        prev = next;
    }
    arr[7] = prev;
}

int main(void) {
    char arr1[9], arr2[9], arr3[9], arr4[9], arr[6];
    int K, top, clock, sum = 0;
    cin >> arr1;
    cin >> arr2;
    cin >> arr3;
    cin >> arr4;
    cin >> K;
    for (int i = 0; i < K; i++) {
        cin >> top >> clock;
        arr[0] = arr1[2]; arr[1] = arr2[6];
        arr[2] = arr2[2]; arr[3] = arr3[6];
        arr[4] = arr3[2]; arr[5] = arr4[6]; // 여기서 3-4 비교는 arr4[6]

        int check[4] = { 0 };
        if (top == 1) {
            if (clock == 1) {
                check[0] = 1;
                if (arr[0] != arr[1]) {
                    check[1] = -1;
                    if (arr[2] != arr[3]) {
                        check[2] = 1;
                        if (arr[4] != arr[5])
                            check[3] = -1;
                    }
                }
            } else {
                check[0] = -1;
                if (arr[0] != arr[1]) {
                    check[1] = 1;
                    if (arr[2] != arr[3]) {
                        check[2] = -1;
                        if (arr[4] != arr[5])
                            check[3] = 1;
                    }
                }
            }
        }
        else if (top == 2) {
            if (clock == 1) {
                check[1] = 1;
                if (arr[0] != arr[1]) {
                    check[0] = -1;
                }
                if (arr[2] != arr[3]) {
                    check[2] = -1;
                    if (arr[4] != arr[5])
                        check[3] = 1;
                }
            } else {
                check[1] = -1;
                if (arr[0] != arr[1]) {
                    check[0] = 1;
                }
                if (arr[2] != arr[3]) {
                    check[2] = 1;
                    if (arr[4] != arr[5])
                        check[3] = -1;
                }
            }
        }
        else if (top == 3) {
            if (clock == 1) {
                check[2] = 1;
                if (arr[2] != arr[3]) {
                    check[1] = -1;
                    if (arr[0] != arr[1]) {
                        check[0] = 1;
                    }
                }
                if (arr[4] != arr[5]) {
                    check[3] = -1;
                }
            } else {
                check[2] = -1;
                if (arr[2] != arr[3]) {
                    check[1] = 1;
                    if (arr[0] != arr[1]) {
                        check[0] = -1;
                    }
                }
                if (arr[4] != arr[5]) {
                    check[3] = 1;
                }
            }
        }
        if (top == 4) {
            if (clock == 1) {
                check[3] = 1;
                if (arr[4] != arr[5]) {
                    check[2] = -1;
                    if (arr[2] != arr[3]) {
                        check[1] = 1;
                        if (arr[0] != arr[1])
                            check[0] = -1;
                    }
                }
            } else {
                check[3] = -1;
                if (arr[4] != arr[5]) {
                    check[2] = 1;
                    if (arr[2] != arr[3]) {
                        check[1] = -1;
                        if (arr[0] != arr[1])
                            check[0] = 1;
                    }
                }
            }
        }

        if (check[0] == 1) ClockWise(arr1);
        else if (check[0] == -1) CounterWise(arr1);

        if (check[1] == 1) ClockWise(arr2);
        else if (check[1] == -1) CounterWise(arr2);

        if (check[2] == 1) ClockWise(arr3);
        else if (check[2] == -1) CounterWise(arr3);

        if (check[3] == 1) ClockWise(arr4);
        else if (check[3] == -1) CounterWise(arr4);
    }
    sum += (arr1[0] - '0' + 2 * (arr2[0] - '0') + 4 * (arr3[0] - '0') + 8 * (arr4[0] - '0'));
    cout << sum << endl;
    return 0;
}

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함
반응형