알고리즘 모음(C++)

백준 14891 - 톱니바퀴(C++) 본문

백준

백준 14891 - 톱니바퀴(C++)

공대생의 잡다한 사전 2022. 1. 7. 17:11

문제 링크입니다. https://www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

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

www.acmicpc.net

삼성 SW 역량테스트 기출문제입니다.

톱니바퀴의 움직임을 구현하는 간단한 문제였습니다.

문제 조건
출력 예시

톱니바퀴가 움직이는 규칙입니다.

1. X번 톱니바퀴가 Y 방향으로 움직인다.

2. X+1, X-1번 톱니바퀴가 X번 톱니바퀴와 맞닿아있는 곳의 극이 다르다면 해당 번호도 움직인다.

3. 움직인 톱니바퀴를 기준으로 앞뒤의 톱니바퀴도 다시 확인한다.

4. 한번 움직인 톱니바퀴는 다시 움직이지 않는다.

 

X번 톱니바퀴와 X+1번 톱니바퀴가 맞닿아있을때, X번은 3번, X+1번은 7번이 서로 맞닿아있습니다.(시계방향기준)

그리고 톱니바퀴가 시계방향으로 돌아가면 (1,2,3,4,5,6,7,8) -> (8,1,2,3,4,5,6,7) 순으로 움직입니다.

반시계 방향으로 돌아가면 (1,2,3,4,5,6,7,8) -> (2,3,4,5,6,7,8,1)순으로 움직입니다. (12시를 1로, 시계방향으로 증가)

 

위의 설명을 통해 코드를 구현하면 쉽게 풀 수 있습니다.

 

 

1. 톱니바퀴 움직이기

void move_Gear(int x, int y) {
	check[x] = 1;
	for (int i = 0; i < 2; i++) {
		int xx = x + dx[i];
		if (xx >= 1 && xx <= 4) {
			if (xx < x) {
				if (Gear[x][6] != Gear[xx][2] && check[xx] == 0) {
					move_Gear(xx, -y);
				}
			}
			else {
				if (Gear[xx][6] != Gear[x][2] && check[xx] == 0) {
					move_Gear(xx, -y);
				}
			}
		}
	}
	int next_state[8];
	for (int i = 0; i < 8; i++) {
		if (y == 1) {
			next_state[i] = Gear[x][Clock[i]];
		}
		else {
			next_state[i] = Gear[x][non_Clock[i]];
		}
	}
	for (int i = 0; i < 8; i++) {
		Gear[x][i] = next_state[i];
	}
}

X번 톱니바퀴와 맞닿아있는 톱니바퀴가 서로 다른 극이며, 전에 돈적이 없는 경우 해당 톱니바퀴를 돌려줍니다.

다른 톱니바퀴를 모두 돌렸으면, X번 톱니바퀴를 마지막으로 돌립니다.

 

 

문제 접근 방법

1. X번 톱니바퀴와 맞닿아있는 톱니바퀴를 확인한다.

2. X번 톱니바퀴를 돌린다.

3. 1~2 과정을 K번 반복한다.

 

 

자세한 것은 코드를 참고해주세요.

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#include <cmath>
#include <cstring>

using namespace std;

int Gear[5][8];
int check[5];
int K;
pair<int, int> way[101];
int dx[2] = { -1,1 };
int Clock[8] = { 7,0,1,2,3,4,5,6 };
int non_Clock[8] = { 1,2,3,4,5,6,7,0 };

void move_Gear(int x, int y) {
	check[x] = 1;
	for (int i = 0; i < 2; i++) {
		int xx = x + dx[i];
		if (xx >= 1 && xx <= 4) {
			if (xx < x) {
				if (Gear[x][6] != Gear[xx][2] && check[xx] == 0) {
					move_Gear(xx, -y);
				}
			}
			else {
				if (Gear[xx][6] != Gear[x][2] && check[xx] == 0) {
					move_Gear(xx, -y);
				}
			}
		}
	}
	int next_state[8];
	for (int i = 0; i < 8; i++) {
		if (y == 1) {
			next_state[i] = Gear[x][Clock[i]];
		}
		else {
			next_state[i] = Gear[x][non_Clock[i]];
		}
	}
	for (int i = 0; i < 8; i++) {
		Gear[x][i] = next_state[i];
	}
}

void solve() {
	int ans = 0;
	for (int i = 0; i < K; i++) {
		move_Gear(way[i].first, way[i].second);
		memset(check, 0, sizeof(check));
	}
	for (int i = 1; i <= 4; i++) {
		if (Gear[i][0] == 1) {
			ans += pow(2, i - 1);
		}
	}
	cout << ans;
}

int main() {
	cin.tie(0);
	cout.tie(0);
	for (int i = 1; i <= 4; i++) {
		for (int j = 0; j < 8; j++) {
			scanf("%01d", &Gear[i][j]);
		}
	}
	cin >> K;
	for (int i = 0; i < K; i++) {
		cin >> way[i].first >> way[i].second;
	}
	solve();
	return 0;
}

 

 

질문 및 조언 댓글 남겨주세요!

'백준' 카테고리의 다른 글

백준 19237 - 어른 상어(C++)  (0) 2022.01.09
백준 23288 - 주사위 굴리기2(C++)  (0) 2022.01.09
백준 21608 - 상어 초등학교(C++)  (0) 2022.01.06
백준 3190 - 뱀(C++)  (0) 2022.01.05
백준 5988 - 홀수일까 짝수일까(C++)  (0) 2022.01.05