Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- BFS
- 재귀
- DP
- 크루스칼
- 메모리풀
- Knapsack
- 비트마스크
- 백트래킹
- 분할 정복
- 시뮬레이션
- MST
- 완전 탐색
- 스택
- 빠른 입출력
- 피보나치 수
- 클래스
- lis
- SSAFY
- 큐
- 우선순위 큐
- 중복 순열
- dfs
- 링크드리스트
- 문자열
- 세그먼트 트리
- BeautifulSoup
- 그리디
- 순열
- 이분 탐색
- 조합
Archives
- Today
- Total
작심 24/7
[백준] 14891번 톱니바퀴 본문
14891번: 톱니바퀴
첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터 �
www.acmicpc.net
구현이 귀찮은 시뮬레이션 문제이다.
회전해야 하는 톱니바퀴를 먼저 체크해준 후 회전시키는 것이 포인트
네 개의 톱니바퀴를 모두 돌린다고 가정할 때
1. 시계 방향, 반시계 방향, 시계 방향, 반시계 방향
2. 반시계 방향, 시계 방향, 반시계 방향, 시계 방향
이렇게 두 가지 경우가 나온다.
이것을 이차원 배열 order에 저장해준 뒤
톱니바퀴의 번호와 방향을 입력받으면
1번 경우인지 2번 경우인지 판단해준 다음
번호에 따라서 바퀴가 돌아가는 순서대로
ex) 1일 때 1 -> 2 -> 3 -> 4, 3일 때 3 -> 4 -> 2 -> 1
회전하면 안 되는 바퀴이면 order의 값을 0으로 바꿔주고
아니면 값을 그대로 두었다.
그러고 order의 값이 0이면 무시,
1이면 시계 방향으로,
-1이면 반시계 방향으로 회전해주었다.
#include <iostream>
#include <algorithm>
#include <string>
#include <cmath>
using namespace std;
int wheel[5][8];
int K, num, direction, res = 0, idx = 0;
void Clockwise(int i) {
for (int j = 0; j < 7; j++) swap(wheel[i][j], wheel[i][7]);
}
void CounterClockwise(int i) {
for (int j = 7; j > 0; j--) swap(wheel[i][j], wheel[i][0]);
}
int main() {
string st;
for (int i = 1; i <= 4; i++) {
cin >> st;
for (int j = 0; j < 8; j++) wheel[i][j] = st[j] - '0';
}
cin >> K;
for (int k = 0; k < K; k++) {
cin >> num >> direction;
int order[2][5] = { { 0, 1, -1, 1, -1 },{ 0, -1, 1, -1, 1 } };
if ((num % 2 == 1 && direction == 1) || (num % 2 == 0 && direction == -1)) idx = 0;
else idx = 1;
if (num == 1) {
for (int i = 2; i <= 4; i++) {
if (wheel[i][6] == wheel[i - 1][2] || order[idx][i - 1] == 0) order[idx][i] = 0;
}
}
else if (num == 2) {
if (wheel[num][2] == wheel[num + 1][6]) order[idx][num + 1] = 0;
if (wheel[num][6] == wheel[num - 1][2]) order[idx][num - 1] = 0;
if (wheel[num + 2][6] == wheel[num + 1][2] || order[idx][num + 1] == 0) order[idx][num + 2] = 0;
}
else if (num == 3) {
if (wheel[num][2] == wheel[num + 1][6]) order[idx][num + 1] = 0;
if (wheel[num][6] == wheel[num - 1][2]) order[idx][num - 1] = 0;
if (wheel[num - 2][2] == wheel[num - 1][6] || order[idx][num - 1] == 0) order[idx][num - 2] = 0;
}
else {
for (int i = 3; i >= 1; i--) {
if (wheel[i][2] == wheel[i + 1][6] || order[idx][i + 1] == 0) order[idx][i] = 0;
}
}
for (int i = 1; i <= 4; i++) {
if (order[idx][i] == 1) Clockwise(i);
else if (order[idx][i] == -1) CounterClockwise(i);
}
}
for (int i = 1; i <= 4; i++) if (wheel[i][0]) res += pow(2, i - 1);
cout << res;
return 0;
}
'백준' 카테고리의 다른 글
[백준] 1062번 가르침 (0) | 2020.07.02 |
---|---|
[백준] 15685번 드래곤 커브 (0) | 2020.07.01 |
[백준] 10835번 카드 게임 (0) | 2020.06.29 |
[백준] 14503번 로봇 청소기 (0) | 2020.06.27 |
[백준] 15748번 Rest Stops (0) | 2020.06.26 |
Comments