알고리즘 관련/BOJ
14891 톱니바퀴
Andrew-Yun
2021. 3. 8. 17:15
14891번: 톱니바퀴
총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴
www.acmicpc.net
간단한 구현 문제지만 톱니바퀴의 회전과 이어서 회전되는 다른 톱니바퀴를 구현하는데 복잡하게 생각하여 시간을 꽤 낭비한 문제이다.
처음 통과했을 때의 코드는 회전을 구현할 때 다소 가독성이 떨어졌는데, 다른 코드를 참고해보니 덱(deque)으로 회전을 쉽게 구현할 수 있다.
1. 반시계 방향으로 회전할 때, 맨 앞의 원소를 맨 뒤에 넣음
2. 시계 방향으로 회전할 때, 맨 뒤의 원소를 맨 앞에 넣음
심플하지만 생각하지 못했던 방법이다.
또한 이어서 회전하는건 재귀함수를 통해 맞닿은 톱니가 같다면, 다음 바퀴도 회전하도록 구현했다.
정답코드
더보기
#include <iostream>
#include <string>
#include <deque>
#include <cmath>
#include <string.h>
using namespace std;
deque<int> wheel[4];
bool visit[4] = { false, };
void rotate(int start, int dir)
{
if (visit[start] == false)
visit[start] = true;
else
return;
if (start + 1 < 4) {
if (wheel[start][2] != wheel[start + 1][6]) {
rotate(start + 1, -dir);
}
}
if (start - 1 >= 0) {
if (wheel[start][6] != wheel[start - 1][2]) {
rotate(start - 1, -dir);
}
}
int temp;
if (dir == -1) {
temp = wheel[start].front();
wheel[start].pop_front();
wheel[start].push_back(temp);
}
else {
temp = wheel[start].back();
wheel[start].pop_back();
wheel[start].push_front(temp);
}
}
int summation()
{
int sum = 0;
for (int i = 0; i < 4; i++) {
if (wheel[i][0] == 1)
sum += pow(2, i);
}
return sum;
}
int main()
{
for (int i = 0; i < 4; i++) {
string temp;
cin >> temp;
for (int j = 0; j < temp.length(); j++)
wheel[i].push_back(temp[j] - '0');
}
int tc, start, dir;
scanf("%d", &tc);
for (int i = 0; i < tc; i++) {
scanf("%d %d", &start, &dir);
rotate(start - 1, dir);
memset(visit, false, sizeof(visit));
}
int answer = summation();
printf("%d\n", answer);
return 0;
}