[백준/BOJ] 백준 14891번 : 톱니바퀴
2020. 8. 7. 18:26ㆍ알고리즘 문제풀이
https://www.acmicpc.net/problem/14891
input_number-1(0~3) 번 톱니바퀴를 turn_kind(-1:반시계 방향, 1:시계 방향)로 회전시키고 그 영향으로 돌아갈 수 있는 톱니바퀴들도 돌린다. 최종 톱니바퀴들의 모습을 통해 점수를 구한다
코드
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
//톱니바퀴의 상태 저장
vector<string> wheel;
//left_right(-1:왼쪽으로 맞닿은 톱니바퀴 돌리기 진행중 1:오른쪽방향으로 맞닿은 톱니바퀴 돌리기 진행중, 0:해당 부분만 돌림)
//number번 톱니바퀴를 turn_kind방향으로 돌린다
void turnWheel(int number, int turn_kind, int left_right)
{
//왼쪽으로 톱니바퀴 돌리기가 진행중 이므로 왼쪽에 맞닿은 톱니바퀴를 돌릴 수 있다면 돌린다
if (left_right == -1)
{
if (number - 1 >= 0 && wheel[number - 1][2] != wheel[number][6])
turnWheel(number - 1, turn_kind*(-1), -1);
}
//오른쪽으로 톱니바퀴 돌리기가 진행중 이므로 오른쪽에 맞닿은 톱니바퀴를 돌릴 수 있다면 돌린다
else if (left_right == 1)
{
if (number + 1 < 4 && wheel[number][2] != wheel[number + 1][6])
turnWheel(number + 1, turn_kind*(-1), 1);
}
//시계 반대 방향으로 톱니바퀴를 돌린다
if (turn_kind == -1)
{
wheel[number] = wheel[number] + wheel[number][0];
wheel[number] = wheel[number].substr(1);
}
//시계 방향으로 톱니바퀴를 돌린다
else if (turn_kind == 1)
{
wheel[number] = wheel[number][7] + wheel[number];
wheel[number] = wheel[number].substr(0, 8);
}
}
//number번 톱니바퀴를 turn_kind(-1:시계반대 방향, 1:시계방향)으로 돌릴때 그 영향으로 돌아가는 톱니 바퀴들을 돌린다
void Solve(int number, int turn_kind)
{
//number번 톱니바퀴를 기준으로 왼쪽으로 맞닿아 있는 톱니 바퀴를 돌린다(범위를 넘어가지 않고, 맞닿은 부분의 극이 다를때)
if (number - 1 >= 0 && wheel[number - 1][2] != wheel[number][6])
turnWheel(number - 1, turn_kind*(-1), -1);
//number번 톱니바퀴를 기준으로 오른쪽으로 맞닿아 있는 톱니 바퀴를 돌린다(범위를 넘어가지 않고, 맞닿은 부분의 극이 다를때)
if (number + 1 < 4 && wheel[number][2] != wheel[number + 1][6])
turnWheel(number + 1, turn_kind*(-1), 1);
//number번 톱니 바퀴를 돌린다
turnWheel(number, turn_kind, 0);
}
int getScore()
{
int ret = 0;
//0~3번 톱니바퀴들의 점수 합을 구한다
for (int i = 0; i < 4; i++)
{
if (wheel[i][0] == '1')
{
if (i == 0)
ret += 1;
else if (i == 1)
ret += 2;
else if (i == 2)
ret += 4;
else if (i == 3)
ret += 8;
}
}
return ret;
}
int main()
{
cin.tie(NULL);
ios_base::sync_with_stdio(false);
string temp;
int input_number, turn_kind;
int k;
//0~3번 톱니바퀴의 상태를 저장한다
for (int i = 0; i < 4; i++)
{
cin >> temp;
wheel.push_back(temp);
}
cin >> k;
for (int i = 0; i < k; i++)
{
cin >> input_number >> turn_kind;
//input_number-1(0~3)번 톱니 바퀴를 turn_kind(-1:반시계 방향, 1:시계 방향)로 회전시키고 그 영향으로 돌아갈 수 있는 톱니바퀴들도 돌린다
Solve(input_number - 1, turn_kind);
}
//현재 톱니바퀴 상태에 따른 점수를 출력한다
cout << getScore();
return 0;
}
'알고리즘 문제풀이' 카테고리의 다른 글
[백준/BOJ] 백준 10807번 : 개수 세기 (0) | 2020.08.08 |
---|---|
[백준/BOJ] 백준 10808번 : 알파벳 개수 (0) | 2020.08.08 |
[백준/BOJ] 백준 17281번 : ⚾ (0) | 2020.08.07 |
[백준/BOJ] 백준 17070번 : 파이프 옮기기 1 (0) | 2020.08.07 |
[백준/BOJ] 백준 1781번 : 컵라면 (0) | 2020.08.06 |