알고리즘/BOJ

백준 15662번 톱니바퀴(2)

꾸준함. 2019. 4. 27. 21:40

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

 

15662번: 톱니바퀴 (2)

총 8개의 톱니를 가지고 있는 톱니바퀴 T개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴가 1번, 그 오른쪽은 2번, ..., 가장 오른쪽 톱니바퀴는 T번이다. 아래 그림은 T가 4인 경우이다. 이때, 톱니바퀴를 총 K번 회전시키려고 한다. 톱니바퀴의 회전은 한 칸을 기준으로 한다. 회전은 시계 방향과 반시계 방향이 있고, 아래 그림과 같이 회전한다

www.acmicpc.net

최근에 비슷한 문제를 푼 적이 있어서 쉽게 풀 수 있었던 문제였습니다.

회전시킬 톱니바퀴를 회전시키지 않은 상태에서 동시에 회전시킬 톱니바퀴들을 모두 찾아야하기 때문에 큐를 써야하고 시계 방향과 반시계 방향으로 돌리는 것을 쉽게 구현하기 위해 덱을 이용했습니다.

 

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
#include <deque>
using namespace std;
const int MAX = 1000;
//톱니바퀴
deque<int> dq[MAX];
int main(void)
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int T;
cin >> T;
for (int t = 0; t < T; t++)
{
string s;
cin >> s;
for (int i = 0; i < s.length(); i++)
dq[t].push_back(s[i] - '0');
}
int K;
cin >> K;
for (int k = 0; k < K; k++)
{
int num, dir;
cin >> num >> dir;
num -= 1;
vector<pair<int, int>> v;
v.push_back({ num, dir });
//횐전시킬 톱니바퀴 찾음
queue<pair<int, int>> q;
q.push({ num, dir });
bool visited[MAX] = { false, };
visited[num] = true;
while (!q.empty())
{
int cur = q.front().first;
int d = q.front().second;
q.pop();
//왼쪽
if(cur != 0)
if (dq[cur][6] != dq[cur - 1][2] && !visited[cur -1])
{
visited[cur - 1] = true;
q.push({ cur - 1, d * -1 });
v.push_back({ cur - 1, d * -1 });
}
//오른쪽
if(cur != T - 1)
if (dq[cur][2] != dq[cur + 1][6] && !visited[cur + 1])
{
visited[cur + 1] = true;
q.push({ cur + 1, d * -1 });
v.push_back({ cur + 1, d * -1 });
}
}
for (int i = 0; i < v.size(); i++)
{
int cur = v[i].first;
int d = v[i].second;
if (d == 1)
{
int temp = dq[cur].back();
dq[cur].pop_back();
dq[cur].push_front(temp);
}
else
{
int temp = dq[cur].front();
dq[cur].pop_front();
dq[cur].push_back(temp);
}
}
}
int result = 0;
for (int t = 0; t < T; t++)
if (dq[t][0] == 1)
result++;
cout << result << "\n";
return 0;
}
view raw .cpp hosted with ❤ by GitHub

 


개발환경:Visual Studio 2017

 

지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

 

반응형

'알고리즘 > BOJ' 카테고리의 다른 글

백준 5373번 큐빙  (0) 2019.04.29
백준 14503번 로봇 청소기  (2) 2019.04.28
백준 16235번 나무 재테크  (2) 2019.04.14
백준 16236번 아기 상어  (2) 2019.04.10
백준 14911번 궁합 쌍 찾기  (0) 2019.04.10