728x90
반응형
이 문제는 삼성 sw 기출 문제이다. 시뮬레이션 문제이다.
중첩 if문이 깊기 때문에 헷갈릴 수 있다는 것을 조심해야한다.
서로 맞닿은 톱니는 index로 표현하면 아래처럼 맞닿아있다.
A톱니바퀴가 회전할 때 서로 맞닿은 톱니의 극이 다르다면 A가 회전한 방향과 반대 방향으로 회전한다.
맞닿은 부분의 극이 같다면 회전하지 않는다.
N극은 0, S극은 1, 1은 시계방향, -1은 반시계방향이다.
1. 반시계방향 회전
뒤 index값을 앞 index에 대치한다.
그리고 맨 앞 index 값은 기록해두다가 맨 뒤 Index와 대치한다.
if(rotation == -1){
char firstNum = saw[sawNum][0];
for(int i = 0; i < 7; i++){
saw[sawNum][i] = saw[sawNum][i+1];
}
saw[sawNum][7] = firstNum;
}
2. 시계방향 회전
거꾸로 순환하면서 앞 index의 값을 뒤 index에 대치한다.
거꾸로 순환하지 않을 경우, 모든 수가 맨 앞 index의 값으로 대치되므로 주의해야한다.
그리고 맨 뒤 index 값은 기록해두다가 맨 앞 index와 대치한다.
else{
char lastNum = saw[sawNum][7];
for(int i = 6; i >= 0; i--){
saw[sawNum][i + 1] = saw[sawNum][i];
}
saw[sawNum][0] = lastNum;
}
회전하는 알고리즘을 구현했으니 톱니바퀴 번호 별로 회전 조건을 확인하여 회전시키는 로직을 구현해보자.
주의해야할 점은 회전하기 전의 톱니 값으로 비교해야한다는 것이다.
1과 4번 톱니바퀴에 경우,
1 -> 2 -> 3 -> 4 // 1번 톱니바퀴
4 -> 3 -> 2 -> 1 // 2번 톱니바퀴
순으로 톱니가 맞닿는지 확인하여 구현하는데,
2와 3번 톱니바퀴는,
1 <- 2 -> 3 -> 4 // 2번 톱니바퀴
4 <- 3 -> 2 -> 1 // 3번 톱니바퀴
순으로 톱니가 맞닿는지 확인한다.
구현한 코드는 이렇다.
//톱니바퀴
#include <iostream>
using namespace std;
string saw[5];
int score[] = {0,1,2,4,8};
void rotateSaw(int sawNum, int rotation){
if(rotation == -1){
char firstNum = saw[sawNum][0];
for(int i = 0; i < 7; i++){
saw[sawNum][i] = saw[sawNum][i+1];
}
saw[sawNum][7] = firstNum;
}
else{
char lastNum = saw[sawNum][7];
for(int i = 6; i >= 0; i--){
saw[sawNum][i + 1] = saw[sawNum][i];
}
saw[sawNum][0] = lastNum;
}
}
void checkNeedRotationAndRotate(int sawNum, int rotation){
if(sawNum == 1){
int number = saw[1][2];
rotateSaw(1,rotation);
if(number != saw[2][6]){
number = saw[2][2];
rotateSaw(2, -1 * rotation);
if(number != saw[3][6]){
number = saw[3][2];
rotateSaw(3, rotation);
if(number != saw[4][6]){
rotateSaw(4, -1 *rotation);
}
}
}
}
else if(sawNum == 2){
int number = saw[2][6];
int number2 = saw[2][2];
rotateSaw(2, rotation);
if(number != saw[1][2]){
rotateSaw(1, -1 *rotation);
}
if(number2 != saw[3][6]){
number = saw[3][2];
rotateSaw(3, -1 * rotation);
if(number != saw[4][6]){
rotateSaw(4, rotation);
}
}
}
else if(sawNum == 3){
int number = saw[3][6];
int number2 = saw[3][2];
rotateSaw(3,rotation);
if(number2 != saw[4][6]){
rotateSaw(4, -1 * rotation);
}
if(number != saw[2][2]){
number = saw[2][6];
rotateSaw(2, -1 * rotation);
if(number != saw[1][2]){
rotateSaw(1, rotation);
}
}
}
else{
int number = saw[4][6];
rotateSaw(4, rotation);
if(number != saw[3][2]){
number = saw[3][6];
rotateSaw(3, -1 * rotation);
if(number != saw[2][2]){
number = saw[2][6];
rotateSaw(2, rotation);
if(number != saw[1][2]){
rotateSaw(1, -1 * rotation);
}
}
}
}
}
int getAnswer(){
int answer = 0;
for(int i = 1; i < 5; i++){
answer += (saw[i][0] - '0') * score[i];
}
return answer;
}
int main(void){
int count, sawNum, rotation;
for(int i = 1; i < 5; i++){
cin >> saw[i];
}
cin >> count;
for(int i = 0; i < count; i++){
cin >> sawNum >> rotation;
checkNeedRotationAndRotate(sawNum, rotation);
}
cout << getAnswer();
}
반응형
'algorithm' 카테고리의 다른 글
[algorithm] 백준 - 사다리 조작 (0) | 2020.12.25 |
---|---|
[algorithm] 백준 - 감시 (0) | 2020.12.24 |
[algorithm] 백준 - 연구소 (0) | 2020.12.24 |
[algorithm] 백준 - 경사로 (0) | 2020.12.23 |
[algorithm] 백준 - 연산자 끼워넣기 (0) | 2020.12.22 |