[문제]
https://www.acmicpc.net/problem/14891
[풀이]
양방향으로 데이터 입출력이 가능한 deque에 방향을 저장해 회전하도록 한다.
[코드]
#include<iostream>
#include<string>
#include<deque>
using namespace std;
deque<char> wheel[4];
void turn_wheel(int num, int dir) { //id톱니 dir방향으로 움직이기
if (dir == -1) //반시계방향
{
wheel[num].push_back(wheel[num][0]);
wheel[num].pop_front();
}
else //시계방향
{
wheel[num].push_front(wheel[num][7]);
wheel[num].pop_back();
}
}
void solution(int num, int dir)
{
char pre_pole = wheel[num][6]; //움직이기 전 왼쪽 극.
int turn_dir = dir;
for (int i = num - 1; i >= 0; i--) //움직일 톱니의 왼쪽 톱니 움직이기
{
turn_dir *= (-1); //극이 다르면 반대방향으로 회전
if (wheel[i][2] == pre_pole) //극이 같은 경우
break;
pre_pole = wheel[i][6];
turn_wheel(i, turn_dir); //톱니 움직이기
}
pre_pole = wheel[num][2]; //움직이기 전 오른쪽 극
turn_dir = dir;
for (int i = num + 1; i < 4; i++) //움직일 톱니의 오른쪽 톱니 움직이기
{
turn_dir *= (-1);
if (wheel[i][6] == pre_pole)
break; //극이 같은 경우
pre_pole = wheel[i][2];
turn_wheel(i, turn_dir);
}
turn_wheel(num, dir); //해당 톱니 움직이기
}
int main()
{
for (int i = 0; i < 4; i++) {
string str;
cin >> str;
for (int j = 0; j < str.size(); j++) {
wheel[i].push_back(str[j]);
}
}
int k;
cin >> k;
for (int i = 0; i < k; i++) {
int num, dir;
cin >> num >> dir;
solution(num - 1, dir);
}
int base = 1;
int total = 0; //n극이면 0점, s극이면 1점.
for (int i = 0; i < 4; i++) {
if (wheel[i][0] == '1') //n극은 0, s극은 1
total += base; //s극이면 1점, 2점, 4점, 8점
base *= 2;
}
cout << total << "\n";
}
'알고리즘 공부 및 문제 풀이 > 백준(BOJ)' 카테고리의 다른 글
[기출 상] N개의 작업공정 - 위상정렬 (0) | 2021.09.08 |
---|---|
[기출 상] 단어 게임 (0) | 2021.09.08 |
[기출 상] 주울 수 있는 최대의 돈2(정수삼각형) (0) | 2021.09.07 |
[기출 상] 백준 19538 루머 (0) | 2021.09.06 |
[기출 상] 프로그래머스 불량 사용자 (0) | 2021.09.06 |