https://www.acmicpc.net/problem/14891
문제를 보면, 톱니가 돌아가는 연산은 시계 방향으로 돌리거나 반시계 방향으로 돌리거나 둘 중 하나이다.
덮어 씌워지는 인덱스가 어떤 것인지 유의하면서 톱니의 회전을 구현해준 이후에는, 문제의 조건에 맞게 상황을 구현해주면 된다.
1번 톱니가 회전하면, 회전하기 이전의 상태에 따라서 2번 톱니가 회전을 할 수도 있고 그렇지 않을 수도 있다.
이렇게 각 번호마다 다르지만 비슷한 패턴으로 조건이 주어져 있기 때문에, 실수하지 않도록 하며 착실하게 구현해주면 되겠다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | #include<iostream> using namespace std; int ring[5][9]; //1~4, 0~7 void rotate(int idx, int dir) { if (dir == -1) {//반시계 int tmp = ring[idx][7]; for (int i = 0; i <= 6; i++) { int move = i - 1; if (move < 0) move = 7; ring[idx][move] = ring[idx][i]; } ring[idx][6] = tmp; } else if (dir == 1) { //시계 int tmp = ring[idx][7]; for (int i = 6; i >= 0; i--) { int move = i + 1; ring[idx][move] = ring[idx][i]; } ring[idx][0] = tmp; } } void process(int idx, int dir) { if (idx ==1) { //1번 톱니 bool re2 = false; //또 돌려야 하는지 if (ring[idx][2] != ring[idx + 1][6]) re2 = true; //접점 극 다르면 또 돌리기 rotate(idx, dir); //또돌리는 처리 if (re2) { bool re3 = false; if (ring[2][2] != ring[3][6]) re3 = true; //3번이랑 접점 확인 rotate(2, dir * -1); if (re3) { bool re4 = false; if (ring[3][2] != ring[4][6]) re4 = true; rotate(3, dir); if (re4) rotate(4, dir * -1); } } } else if (idx == 2) { bool re1 = false, re3 = false; if (ring[1][2] != ring[2][6]) re1 = true; if (ring[2][2] != ring[3][6]) re3 = true; rotate(2, dir); if (re1) rotate(1, dir * -1); if (re3) { bool re4 = false; if (ring[3][2] != ring[4][6]) re4 = true; rotate(3, dir * -1); if (re4) rotate(4, dir); } } else if (idx == 3) { bool re2 = false, re4 = false; if (ring[2][2] != ring[3][6]) re2 = true; if (ring[3][2] != ring[4][6]) re4 = true; rotate(3, dir); if (re2) { bool re1 = false; if (ring[2][6] != ring[1][2]) re1 = true; rotate(2, dir * -1); if (re1) rotate(1, dir); } if (re4) rotate(4, dir * -1); } else if (idx == 4) { bool re3 = false; if (ring[4][6] != ring[3][2]) re3 = true; rotate(4, dir); if (re3) { bool re2 = false; if (ring[3][6] != ring[2][2]) re2 = true; rotate(3, dir * -1); if (re2) { bool re1 = false; if (ring[2][6] != ring[1][2]) re1 = true; rotate(2, dir); if (re1) rotate(1, dir * -1); } } } } int main(void) { for (int i = 1; i <= 4; i++) for (int j = 0; j < 8; j++) scanf("%1d", &ring[i][j]); int num; cin >> num; while (num--) { int idx, dir; cin >> idx >> dir; process(idx, dir); } int score = 0; for (int i = 1; i <= 4; i++) { if (ring[i][0] == 1 && i == 1) score++; else if (ring[i][0] == 1 && i == 2) score+= 2; else if (ring[i][0] == 1 && i == 3) score+= 4; else if (ring[i][0] == 1 && i == 4) score+= 8; } cout << score; return 0; } | cs |
'알고리즘 문제 풀이 > 백준 온라인 저지' 카테고리의 다른 글
백준 14890번: 경사로 (C++) (0) | 2019.08.09 |
---|---|
백준 14889번: 스타트와 링크 (C++) (0) | 2019.08.07 |
백준 15683번: 감시 (C++) (0) | 2019.08.07 |
백준 14502번: 연구소 (C++) (0) | 2019.08.07 |
백준 15685번: 드래곤 커브 (C++) (0) | 2019.08.06 |