728x90
https://www.acmicpc.net/problem/14891
문제풀이
톱나바퀴의 초기 상태와 톱니바퀴를 회전시킨 방법이 주어졌을 때, 최종 톱니바퀴의 상태를 구하기
톱니바퀴 회전 조건
1. 회전하는 톱니바퀴 기준으로 인접해 있는 톱니바퀴가 다른 극이라면 반대편 톱니바퀴 회전x(항상 기준은 회전하는 톱니바퀴에서 다음으로 오는 극을 기준으로함.)
2. 회전하는 톱니바퀴 기준 인접해 있는 톱니바퀴가 같은 극이라면 회전o
톱나바퀴의 초기 상태와 톱니바퀴를 회전시킨 방법이 주어졌을 때, 최종 톱니바퀴의 상태를 구하기
톱니바퀴 회전 조건
1. 회전하는 톱니바퀴 기준으로 인접해 있는 톱니바퀴가 다른 극이라면 반대편 톱니바퀴 회전x(항상 기준은 회전하는 톱니바퀴에서 다음으로 오는 극을 기준으로함.)
2. 회전하는 톱니바퀴 기준 인접해 있는 톱니바퀴가 같은 극이라면 회전o
입력
첫 4줄 각 줄 별로 1,2,3,4번 톱니바퀴의 상태를 의미함(0:N극, 1:S극, 시작은 12시방향부터 시계방향으로 주어짐.)
다섯째 줄에는 회전 횟수 K(1~100)
다음 K개의 줄에는 회전 방법이 순서대로 주어진다.
첫번째 숫자는 회전시킨 톱니바퀴의 번호, 두번째 정수는 방향을 의미함(1:시계방향, -1:반시계방향)
출력
총 K번 회전시킨 이후에 네 톱니바퀴의 점수의 합을 출력(마지막 상태만 보고 점수를 출력함)
점수 계산
12시 방향이 S극이면 1번:1점, 2번:2점. 3번:4점, 4번:8번
나머지는 0점
1번 톱니바퀴 -> 3번째번호와 2번 톱니바퀴 7번째번호와 붙어있음
3번 톱니바퀴 -> 7번째번호와 2번 톱니바퀴 3번째번호, 4번 톱니바퀴 7번째 번호와 붙어있음
*주의 회전할 때 맞닿아 있는 기준으로 판단함.
총 K번 회전시킨 이후에 네 톱니바퀴의 점수의 합을 출력(마지막 상태만 보고 점수를 출력함)
점수 계산
12시 방향이 S극이면 1번:1점, 2번:2점. 3번:4점, 4번:8번
나머지는 0점
1번 톱니바퀴 -> 3번째번호와 2번 톱니바퀴 7번째번호와 붙어있음
3번 톱니바퀴 -> 7번째번호와 2번 톱니바퀴 3번째번호, 4번 톱니바퀴 7번째 번호와 붙어있음
*주의 회전할 때 맞닿아 있는 기준으로 판단함.
#include <iostream>
#include <vector>
using namespace std;
string whleel[5];
int command[100][2];
//시계방향
void moveR(int n){
int temp = whleel[n][7];
for(int i = 7;i>=0;i--)
whleel[n][i] = whleel[n][i-1];
whleel[n][0] = temp;
}
//반시계방향
void moveL(int n){
int temp = whleel[n][0];
for(int i = 0;i<7;i++)
whleel[n][i] = whleel[n][i+1];
whleel[n][7] = temp;
}
void solve(int n, int d){
if(n == 1){//1번 톱니바퀴가 돌아갈 경우
if(d == 1){
if(whleel[1][2] != whleel[2][6]){
if(whleel[2][2] != whleel[3][6]){
if(whleel[3][2] != whleel[4][6])
moveL(4);
moveR(3);
}
moveL(2);
}
moveR(1);
}
else{
if(whleel[1][2] != whleel[2][6]){
if(whleel[2][2] != whleel[3][6]){
if(whleel[3][2] != whleel[4][6])
moveR(4);
moveL(3);
}
moveR(2);
}
moveL(1);
}
}
else if(n == 2){//2번 톱니바퀴가 돌아갈 경우
if(d == 1){
if(whleel[1][2] != whleel[2][6])
moveL(1);
if(whleel[2][2] != whleel[3][6]){
if(whleel[3][2] != whleel[4][6])
moveR(4);
moveL(3);
}
moveR(2);
}
else{
if(whleel[1][2] != whleel[2][6])
moveR(1);
if(whleel[2][2] != whleel[3][6]){
if(whleel[3][2] != whleel[4][6])
moveL(4);
moveR(3);
}
moveL(2);
}
}
else if(n == 3){//3번 톱니바퀴가 돌아갈 경우
if(d == 1){
if(whleel[3][2] != whleel[4][6])
moveL(4);
if(whleel[2][2] != whleel[3][6]){
if(whleel[1][2] != whleel[2][6])
moveR(1);
moveL(2);
}
moveR(3);
}
else{
if(whleel[3][2] != whleel[4][6])
moveR(4);
if(whleel[2][2] != whleel[3][6]){
if(whleel[1][2] != whleel[2][6])
moveL(1);
moveR(2);
}
moveL(3);
}
}
else{//4번 톱니바퀴가 돌아갈 경우
if(d == 1){
if(whleel[3][2] != whleel[4][6]){
if(whleel[2][2] != whleel[3][6]){
if(whleel[1][2] != whleel[2][6])
moveL(1);
moveR(2);
}
moveL(3);
}
moveR(4);
}
else{
if(whleel[3][2] != whleel[4][6]){
if(whleel[2][2] != whleel[3][6]){
if(whleel[1][2] != whleel[2][6])
moveR(1);
moveL(2);
}
moveR(3);
}
moveL(4);
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int K, answer = 0;
for(int i = 1; i<5; i++)
cin >> whleel[i];
cin>>K;
for(int i = 0; i<K; i++){
cin >> command[i][0];
cin >> command[i][1];
}
//동작
for(int i = 0; i<K; i++)
solve(command[i][0], command[i][1]);
//점수 계산
if(whleel[1][0] == '1')
answer += 1;
if(whleel[2][0] == '1')
answer += 2;
if(whleel[3][0] == '1')
answer += 4;
if(whleel[4][0] == '1')
answer += 8;
cout << answer << '\n';
return 0;
}
*조금 하드코딩한 느낌이 들긴하다...
조금 더 개선할 필요가 있어보인다.
728x90
'🥇Baekjoon Solutions > 삼성SW 기출' 카테고리의 다른 글
[C++] 백준 23288번: 주사위 굴리기2 (0) | 2022.04.29 |
---|---|
[C++] 백준 16236번: 아기 상어 (0) | 2022.04.26 |
[C++] 백준 14503번: 로봇 청소기(삼성SW기출) (0) | 2021.10.24 |
[C++] 백준 12100번: 2048 (Easy)(삼성SW기출) (0) | 2021.09.22 |
[C++] 백준 13460번: 구슬 탈출2(삼성SW기출) (0) | 2021.09.19 |
댓글