https://www.acmicpc.net/problem/14891
1. 문제 이해
이 문제를 풀면서 하나 깨닳은 것은 문제 이해가 개인적으로 정말 중요하다는것을 느꼈습니다....
뱀문제와 마찬가지로 시뮬레이션 문제 입니다.
2. 접근 방법
[1 단계] 입력되는 dir변수에 따라서 시계방향으로 돌지, 반 시계방향으로 돌지 정하게 됩니다.
[2 단계] 왼쪽, 오른쪽을 검사하여 서로 다른 값이 있다면 반대방향으로 돌려주고,
서로 같은 값이 있다면 돌려 움직이지 않습니다.
=> 저같은 경우는 이 부분을 왼쪽 오른쪽 으로 나눠서 재귀로 작성하였습니다.
cf> 이 부분에서 논리적으로 잘못생각하여 시간이 꽤 걸렸습니다.
돌리기전에 양옆을 먼저 확인하여 옆 톱니가 움직이는지 여부를 먼저 결정해줘야 합니다!!!
[3 단계] 12시 방향에 있는것들의 가중치를 곱해 답을 출력합니다.
3. 문제 해결
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 | #include <cstdio> using namespace std; int res; int gear[5][8]; void rotate_gear(int n, int d) { if (d == 1) { // 시계방향 int tmp = gear[n][7]; for (int i = 6; i >= 0; i--) { gear[n][i + 1] = gear[n][i]; } gear[n][0] = tmp; } else if (d == -1) { // 반 시계 방향 int tmp = gear[n][0]; for (int i = 1; i < 8; i++) { gear[n][i - 1] = gear[n][i]; } gear[n][7] = tmp; } } void move_right(int n, int d) { if (!(1 <= n && n <= 4)) return; if (gear[n - 1][2] != gear[n][6]) { d = (d == 1) ? -1 : 1; move_right(n + 1, d); rotate_gear(n, d); } } void move_left(int n, int d) { if (!(1 <= n && n <= 4)) return; if (gear[n][2] != gear[n + 1][6]) { d = (d == 1) ? -1 : 1; move_left(n - 1, d); rotate_gear(n, d); } } int main() { for (int i = 1; i < 5; i++) { for (int j = 0; j < 8; j++) { scanf("%1d", &gear[i][j]); } } int k; scanf("%d", &k); for (int i = 0; i < k; i++) { int bun, dir; scanf("%d %d", &bun, &dir); move_left(bun - 1, dir); move_right(bun + 1, dir); rotate_gear(bun, dir); } res = gear[1][0] + (2 * gear[2][0]) + (4 * gear[3][0]) + (8 * gear[4][0]); printf("%d\n", res); return 0; } | cs |
'Algorithm > solution' 카테고리의 다른 글
#2178. 미로탐색 (0) | 2018.12.24 |
---|---|
#14503. 로봇 청소기 (1) | 2018.01.22 |
#14502. 연구소 (4) | 2018.01.16 |
#1953. [모의 SW 역량테스트] 탈주범 검거 (0) | 2018.01.07 |
#1759. 암호 만들기 (0) | 2017.12.29 |