문제 링크입니다: https://www.acmicpc.net/problem/15662
15662번: 톱니바퀴 (2)
총 8개의 톱니를 가지고 있는 톱니바퀴 T개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴가 1번, 그 오른쪽은 2번, ..., 가장 오른쪽 톱니바퀴는 T번이다. 아래 그림은 T가 4인 경우이다. 이때, 톱니바퀴를 총 K번 회전시키려고 한다. 톱니바퀴의 회전은 한 칸을 기준으로 한다. 회전은 시계 방향과 반시계 방향이 있고, 아래 그림과 같이 회전한다
www.acmicpc.net
최근에 비슷한 문제를 푼 적이 있어서 쉽게 풀 수 있었던 문제였습니다.
회전시킬 톱니바퀴를 회전시키지 않은 상태에서 동시에 회전시킬 톱니바퀴들을 모두 찾아야하기 때문에 큐를 써야하고 시계 방향과 반시계 방향으로 돌리는 것을 쉽게 구현하기 위해 덱을 이용했습니다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; | |
} |


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
반응형
'알고리즘 > 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 |