반응형
알고리즘 분류 : 시뮬레이션
톱니바퀴의 회전 동작을 시뮬레이션하는 문제다. 문제는 어렵지 않으나, 회전 방향이 헷갈려서 귀찮은 문제다.
- 입력으로 주어지는 톱니바퀴를 기준으로 시작한다.
- 톱니바퀴의 인덱스는 12시 방향부터 시계방향으로 [ 0 1 2 3 4 5 6 7 ] 로 둔다.
- 1. 기준 톱니바퀴의 왼쪽에 톱니바퀴가 있다면, 기준 톱니바퀴의 왼쪽 톱니(인덱스 6)와 왼쪽 톱니바퀴의 오른쪽 톱니(인덱스 2)를 비교한다.
- 2. 극이 다르다면, 왼쪽 톱니바퀴의 회전 방향을 기준 톱니바퀴의 반대 회전 방향으로 저장한다.
- 첫 번째 톱니바퀴까지 1~2 과정을 반복하여, 회전 방향을 저장해둔다.
- 3. 기준 톱니바퀴의 오른쪽에 톱니바퀴가 있다면, 기준 톱니바퀴의 오른쪽 톱니(인덱스 2)와 오른쪽 톱니바퀴의 왼쪽 톱니(인덱스 6)를 비교한다.
- 4. 극이 다르다면, 오른쪽 톱니바퀴의 회전 방향을 기준 톱니바퀴의 반대 회전 방향으로 저장한다.
- 네 번째 톱니바퀴까지 3~4 과정을 반복하여, 회전 방향을 저장해둔다.
- 마지막으로, 저장해둔 회전 방향에 따라 각 톱니바퀴를 회전시킨다.
- 위 과정을 K번 반복한다.
C++ 소스코드
int a[4][8]; int k, ans; void rotate(int n, int d) { int t[8]; if (d == 1) { for (int i=0; i<8; i++) { t[(i+1)%8] = a[n][i]; } } else { for (int i=0; i<8; i++) { t[i] = a[n][(i+1)%8]; } } for (int i=0; i<8; i++) { a[n][i] = t[i]; } } void solve() { while (k--) { int n, d; scanf("%d %d", &n, &d); n--; int direct[4] = {0}; direct[n] = d; for (int i=n; i<3; i++) { if (a[i][2] != a[i+1][6]) direct[i+1] = -direct[i]; } for (int i=n; i>0; i--) { if (a[i][6] != a[i-1][2]) direct[i-1] = -direct[i]; } for (int i=0; i<4; i++) { if (direct[i]) { rotate(i, direct[i]); } } } } int main() { for (int i=0; i<4; i++) { for (int j=0; j<8; j++) { scanf("%1d", &a[i][j]); } } scanf("%d", &k); solve(); for (int i=0; i<4; i++) { if (a[i][0]) ans += (1<<i); } printf("%d\n", ans); return 0; }
Python 3 소스코드
def rotate(n, d): t = [0]*8 if d == 1: for i in range(8): t[(i+1)%8] = a[n][i] else: for i in range(8): t[i] = a[n][(i+1)%8] for i in range(8): a[n][i] = t[i] def solve(): for _ in range(int(input())): n, d = map(int, input().split()) direct = [0]*4 direct[n-1] = d for i in range(n-1, 3): if a[i][2] != a[i+1][6]: direct[i+1] = -direct[i] for i in range(n-1, 0, -1): if a[i][6] != a[i-1][2]: direct[i-1] = -direct[i] for i in range(4): if direct[i]: rotate(i, direct[i]) a = [list(input().strip()) for _ in range(4)] solve() ans = 0 for i in range(4): if a[i][0] == '1': ans += (1<<i) print(ans)
참고
- 백준 온라인 저지 : BOJ 14891
반응형