https://www.acmicpc.net/problem/14891
문제는 길기 때문에 위 링크에서 확인하길 바란다.
풀이
입력이 string으로 주어진다. 톱니바퀴는 4개로 고정이므로 4개의 입력을 받고 K개의 회전을 입력받는다. 이때 회전하는 톱니의 왼쪽, 오른쪽을 구분하여 계산한다. 알고리즘의 동작 순서는 다음과 같다.
- 돌리는 톱니의 왼쪽부터 확인한다.
- 현재 톱니는 돌리는 톱니이다.
- 만약 맞물리는 부분이 상극인 경우 현재 톱니를 어느 방향으로 돌리는지 배열에 표시하고 왼쪽 톱니가 현재 톱니가 된다.
- 끝까지 가거나 맞물리는 부분이 상극이 아니어 회전하지 않을 때까지 반복한다.
- 오른쪽 부분도 같은 과정을 진행한다.
- 회전하는 방향을 표시해놓은 배열을 보며 톱니를 회전시킨다. 0인 경우 회전하지 않고 1인 경우 시계방향, -1인 경우 반시계방향으로 회전한다.
- K번의 회전이 끝난 후 12시에 있는 극이 무엇인지 보고 결과값을 출력한다.
소스 코드
#include <iostream>
#include <string>
#include <cstring>
#include <vector>
#include <deque>
using namespace std;
const int MN = 101;
string wheel[5]; //1~4까지 톱니의 번호
int main() {
cin >> wheel[1] >> wheel[2] >> wheel[3] >> wheel[4]; //4가지 톱니를 입력받음
int K; cin >> K;
int rotation[5]; //회전을 표시하는 배열
for(int i = 0; i < K; i++) {
memset(rotation, 0, sizeof(rotation)); //배열 초기화
int num, direction; cin >> num >> direction;
rotation[num] = direction; //현재 톱니의 회전 방향 체크
//회전하는 톱니 왼쪽
int now = num; //현재 톱니
int nowd = direction; //현재 방향
for(int w = num-1; w > 0; w--) {
if(wheel[now][6] != wheel[w][2]) { //상극인 경우
rotation[w] = -nowd; //반대 방향으로 회전 표시
nowd = -nowd; //현재 방향 수정
now--; //다음 톱니로 이동
}
else { //같은 극인 경우
rotation[w] = 0; //회전하지 않는다고 표시 후 종료
break;
}
}
//회전하는 톱니 오른쪽
now = num; //현재 톱니
nowd = direction; //현재 방향
for(int w = num+1; w <= 4; w++) {
if(wheel[now][2] != wheel[w][6]) { //상극인 경우
rotation[w] = -nowd; //반대 방향으로 회전 표시
nowd = -nowd; //현재 방향 수정
now++; //다음 톱니로 이동
}
else { //같은 극인 경우
rotation[w] = 0; //회전하지 않는다고 표시 후 종료
break;
}
}
//톱니바퀴 회전시키기
for(int j = 1; j <= 4; j++) {
if(rotation[j] == 0) continue; //회전하지 않는 경우 건너뛰기
if(rotation[j] == 1) { //시계방향으로 회전하는 경우
string tmp = wheel[j].substr(0, 7);
wheel[j] = wheel[j][7] + tmp;
}
else if(rotation[j] == -1) { //반시계방향으로 회전하는 경우
string tmp = wheel[j].substr(1);
wheel[j] = tmp + wheel[j][0];
}
}
}
//결과 계산
int ans = 0;
if(wheel[1][0] == '1') ans++;
if(wheel[2][0] == '1') ans +=2;
if(wheel[3][0] == '1') ans += 4;
if(wheel[4][0] == '1') ans += 8;
cout << ans;
}
위 풀이를 그대로 구현한 코드이다.
채점 결과
'알고리즘 > 백준' 카테고리의 다른 글
[C++] 백준 15684번 사다리 조작 풀이 (0) | 2021.08.27 |
---|---|
[C++] 백준 14500번 테트로미노 풀이 (0) | 2021.08.25 |
[C++] 백준 12865번 평범한 배낭 풀이 (0) | 2021.08.24 |
[C++] 백준 1958번 LCS 3 풀이 (0) | 2021.08.24 |
[C++] 백준 5502번 펠린드롬 풀이 (0) | 2021.08.24 |