반응형
백준 14891번 톱니바퀴
- 전형적인 시뮬레이션 문제이다.
2차원 배열을 더 쓰면 간단하게 할 수 있지만, 4개 밖에 되지 않아 하드 코딩했다. - https://www.acmicpc.net/problem/14891
-
풀이방법
1) 시계 방향으로 회전하는 함수 구현, 반시계 방향으로 회전하는 함수 구현
2) 입력 받은 톱니바퀴 기준으로 어느 방향으로 돌아야 하는지 check
3) check 배열을 기준으로 회전 -
함수 설명
1) right_rotate(char arr[]), left_rotate(char arr[]) : 시계, 반시계 회전 함수
2) check_direction(int gear, int direct) : 입력받은 톱니바퀴 번호와, 방향을 기준으로 check 배열에 값 넣음
3) move_gear(): check 배열을 기준으로 톱니바퀴 이동
#include<iostream>
#include<cstdlib>
#include<vector>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
char gear1[9], gear2[9], gear3[9], gear4[9];
int check[5];
int K;
int ans;
void right_rotate(char arr[]) { //시계방향으로 회전 1
char temp = arr[7];
for (int i = 7; i > 0; i--) arr[i] = arr[i - 1];
arr[0] = temp;
}
void left_rotate(char arr[]) { //시계방향으로 회전 1
char temp = arr[0];
for (int i = 0; i < 7; i++) arr[i] = arr[i+1];
arr[7] = temp;
}
void check_direction(int gear, int direct) {
if (gear == 1) {
check[1] = direct;
if (gear1[2] != gear2[6]) check[2] = (check[1]*-1);
if (check[2]!=0 && gear2[2] != gear3[6]) check[3] = (check[2]*-1);
if (check[3] != 0 && gear3[2] != gear4[6]) check[4] = (check[3]*-1);
}
else if (gear == 2) {
check[2] = direct;
if (gear1[2] != gear2[6]) check[1] = (check[2] * -1);
if (gear2[2] != gear3[6]) check[3] = (check[2] * -1);
if (check[3]!=0 && gear3[2] != gear4[6]) check[4] = (check[3] * -1);
}
else if (gear == 3) {
check[3] = direct;
if (gear3[2] != gear4[6]) check[4] = (check[3] * -1);
if (gear2[2] != gear3[6]) check[2] = (check[3] * -1);
if (check[2] !=0 && gear1[2] != gear2[6]) check[1] = (check[2] * -1);
}
else if (gear == 4) {
check[4] = direct;
if (gear3[2] != gear4[6]) check[3] = (check[4] * -1);
if (check[3] != 0 && (gear2[2] != gear3[6])) check[2] = (check[3] * -1);
if (check[2] !=0 && (gear1[2] != gear2[6])) check[1] = (check[2] * -1);
}
}
void move_gear() {
if (check[1] == 1) right_rotate(gear1);
else if (check[1] == -1) left_rotate(gear1);
if (check[2] == 1) right_rotate(gear2);
else if (check[2] == -1) left_rotate(gear2);
if (check[3] == 1) right_rotate(gear3);
else if (check[3] == -1) left_rotate(gear3);
if (check[4] == 1) right_rotate(gear4);
else if (check[4] == -1) left_rotate(gear4);
}
void sol() {
ans = gear1[0] - '0' + ((gear2[0] - '0') * 2) + ((gear3[0] - '0') * 4) + ((gear4[0] - '0') * 8);
cout << ans;
}
int main(void) {
for (int i = 0; i < 8; i++) cin >> gear1[i];
for (int i = 0; i < 8; i++) cin >> gear2[i];
for (int i = 0; i < 8; i++) cin >> gear3[i];
for (int i = 0; i < 8; i++) cin >> gear4[i];
cin >> K;
int num1, num2;
for (int i = 0; i < K; i++) {
cin >> num1 >> num2;
check_direction(num1, num2);
move_gear();
memset(check, 0, sizeof(check));
}
sol();
}
반응형
'알고리즘 > acmicpc' 카테고리의 다른 글
[백준][5014번] 스타트링크[cpp, c++] (0) | 2020.01.29 |
---|---|
[백준][1475번] 방 번호 [cpp, c++] (0) | 2020.01.22 |
[백준][11559번] Puyo Puyo [cpp, c++] (0) | 2020.01.18 |
[백준][11720번] 숫자의 합 [C언어] (0) | 2019.03.28 |
[백준][11721번] 열 개씩 끊어 출력하기 [C언어] (0) | 2019.03.28 |