본문 바로가기
백준/삼성기출문제

백준 14891 c+ "톱니바퀴" -PlusUltraCode-

by PlusUltraCode 2024. 11. 3.

 

#include <iostream>
#include <cstring>

using namespace std;
string gear[4];
int isRotate[4];

void init() {
	for (int i = 0; i < 4; i++)
		isRotate[i] = 0;
}

void move(int idx, int clock) {
	if (clock == 1)
		gear[idx] = gear[idx].substr(7) + gear[idx].substr(0, 7);
	else if (clock == -1)
		gear[idx] = gear[idx].substr(1, 7) + gear[idx].substr(0, 1);
}

void left_check(int idx, int clock) {
	if (idx <= 0) return;
	if (gear[idx][6] != gear[idx - 1][2]) {
		isRotate[idx - 1] = clock * -1;
		left_check(idx - 1, clock * -1);
	}
}

void right_check(int idx, int clock) {
	if (idx >= 3) return;
	if (gear[idx][2] != gear[idx + 1][6]) {
		isRotate[idx + 1] = clock * -1;
		right_check(idx + 1, clock * -1);
	}
}

void check(int idx, int clock) {
	isRotate[idx] = clock;
	left_check(idx, clock);
	right_check(idx, clock);

	for (int i = 0; i < 4; i++) {
		move(i, isRotate[i]);
	}
}

int main() {
	int ans = 0;
	for (int i = 0; i < 4; i++) {
		cin >> gear[i];
	}
	int k;
	int g; int r;
	cin >> k;
	for (int i = 0; i < k; i++) {
		cin >> g >> r;
		init();
		check(g - 1, r);
	}
	int mul = 1;
	for (int i = 0; i < 4; i++) {
		ans += (gear[i][0] - '0') * mul;
		mul *= 2;
	}

	cout << ans;
}

https://www.acmicpc.net/status?user_id=kkd06144&problem_id=14891&from_mine=1

 

 

 

[필자 사고]

톱니바퀴의 숫자가 작아 여차하면 하나하나 모든 경우의수로 코딩이 가능한 문제이지만

필자는 다음과 같이 코딩했따.

 

기준선이 있고 기준선을 기준으로 왼쪽 방향과 오른쪽 방향으로 2분화하여 코딩을 진행하였다.

 

단순구현 문제이기 때문에 문제를 읽으면서 놓치는 부분이 없는지 항상 조심해야 된다.

아래는 소스코드 해설이다.

코드 설명

  1. 변수 선언
    • gear[4]: 각 톱니바퀴의 상태를 문자열로 저장합니다.
    • isRotate[4]: 각 톱니바퀴가 회전할지 여부와 회전 방향을 저장합니다.
  2. init() 함수
    • 회전 방향 배열 isRotate를 초기화하여 모든 톱니바퀴의 회전 상태를 0으로 설정합니다.
  3. move(int idx, int clock) 함수
    • clock 값에 따라 톱니바퀴를 회전합니다.
    • clock이 1일 때는 시계 방향으로, -1일 때는 반시계 방향으로 회전합니다.
  4. left_check(int idx, int clock) 함수
    • 왼쪽 톱니바퀴가 회전할지 확인하는 함수입니다.
    • 현재 톱니바퀴와 왼쪽 톱니바퀴가 맞닿는 부분이 서로 다른지 확인하고, 다를 경우 왼쪽 톱니바퀴에 반대 방향의 회전값을 설정합니다.
  5. right_check(int idx, int clock) 함수
    • 오른쪽 톱니바퀴가 회전할지 확인하는 함수입니다.
    • 현재 톱니바퀴와 오른쪽 톱니바퀴가 맞닿는 부분이 서로 다른지 확인하고, 다를 경우 오른쪽 톱니바퀴에 반대 방향의 회전값을 설정합니다.
  6. check(int idx, int clock) 함수
    • 특정 톱니바퀴를 기준으로 양쪽 톱니바퀴가 어떻게 회전할지 확인합니다.
    • left_check와 right_check를 호출하여 각 톱니바퀴의 회전 여부를 결정한 후, move 함수를 통해 실제로 회전시킵니다.
  7. main 함수
    • 초기 톱니바퀴 상태를 입력받고, 회전 명령을 처리합니다.
    • 최종적으로 네 톱니바퀴의 상태를 바탕으로 점수를 계산하여 출력합니다.

[소스 코드]