리뷰
https://www.acmicpc.net/problem/15662
톱니바퀴를 회전시켜 연쇄반응을 구현하는 문제
전역 변수
- t : 톱니바퀴의 개수를 저장할 변수
- k : 회전의 횟수를 저장할 변수
- flag : 회전 방향을 체크하기 위한 변수
- deq : 톱니바퀴의 상태를 저장할 덱 배열
함수
1. turn_right
void turn_right(int idx)
톱니바퀴를 오른쪽으로 회전시키는 시뮬레이션을 진행할 함수
- 매개 변수로 톱니바퀴의 번호 idx를 전달 받는다.
- 톱니바퀴 번호가 idx인 덱에서 뒤의 요소를 뺀 뒤 앞의 요소로 집어넣는다.
- 작업 후에는 flag를 반전시킨다.
2. turn_left
void turn_left(int idx)
톱니바퀴를 왼쪽으로 회전시키는 시뮬레이션을 진행할 함수
- 매개 변수로 톱니바퀴의 번호 idx를 전달 받는다.
- 톱니바퀴 번호가 idx인 덱에서 앞의 요소를 뺀 뒤 뒤의 요소로 집어넣는다.
- 작업 후에는 flag를 반전시킨다.
문제풀이
- t값을 입력 받고, t개의 톱니바퀴 정보를 입력 받아 deq배열에 값을 push해준다.
- k값을 입력 받고, k번의 while루프를 수행하고, 매 루프마다 톱니바퀴의 번호 a, 회전 정보 b를 입력 받는다.
- 벡터 left, right에 회전이 필요한 톱니바퀴 번호를 저장해준다, 앞쪽의 톱니바퀴 2번과 뒤쪽 6번이 다르면 된다.
- b가 -1이라면 a번 톱니바퀴를 왼쪽, 1이라면 오른쪽으로 회전시킨다.
- left, right 벡터를 순회하며 flag에 따라 톱니바퀴를 왼쪽 및 오른쪽으로 회전시킨다.
- 작업이 모두 종료된 후 모든 톱니바퀴를 순회하며 12시의 극이 S 즉 1인 경우의 개수를 구해 출력한다.
트러블 슈팅
없음
참고 사항
- 입력이 불친절하므로 문자열로 받아 처리하거나 문자로 받아 정수로 파싱해 사용하면 편하다.
정답 코드
#include<iostream>
#include<vector>
#include<deque>
using namespace std;
int t, k, flag;
deque<char> deq[1001];
void turn_right(int idx) {
char ch = deq[idx].back();
deq[idx].pop_back();
deq[idx].push_front(ch);
flag ^= 1;
}
void turn_left(int idx) {
char ch = deq[idx].front();
deq[idx].pop_front();
deq[idx].push_back(ch);
flag ^= 1;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> t;
for (int i = 1; i <= t; ++i) {
string s; cin >> s;
for (int j = 0; j < 8; ++j) {
deq[i].push_back(s[j]);
}
}
cin >> k;
while (k--) {
int a, b; cin >> a >> b;
vector<int> left, right;
int L = a;
while (--L > 0) {
if (deq[L][2] != deq[L + 1][6]) left.push_back(L);
else break;
}
int R = a;
while (++R <= t) {
if (deq[R - 1][2] != deq[R][6]) right.push_back(R);
else break;
}
flag = 0;
if (b == -1) {
turn_left(a);
for (int i : left) {
if (flag) turn_right(i);
else turn_left(i);
}
flag = 1;
for (int i : right) {
if (flag) turn_right(i);
else turn_left(i);
}
}
else if (b == 1) {
turn_right(a);
for (int i : left) {
if (flag) turn_left(i);
else turn_right(i);
}
flag = 1;
for (int i : right) {
if (flag) turn_left(i);
else turn_right(i);
}
}
}
int ans = 0;
for (int i = 1; i <= t; ++i) {
if (deq[i][0] == '1') ans++;
}
cout << ans;
}
728x90
'알고리즘 공부 > C++' 카테고리의 다른 글
[S1] 백준 29197번 아침 태권도 C++ 수학, 기하학, 해시맵 (0) | 2025.02.26 |
---|---|
[G5] 백준 19940번 피자 오븐 C++ 너비 우선 탐색 (0) | 2025.02.26 |
[S3] 백준 2149번 암호 해독 C++ 문자열, 정렬 (0) | 2025.02.26 |
[G4] 백준 14267번 회사 문화 1 C++ 세그먼트 트리, 느리게 갱신되는 세그먼트 트리, 오일러 경로 테크닉 (0) | 2025.02.26 |
[G3] 백준 2151번 거울 설치 C++ 다익스트라 (0) | 2025.02.25 |