-
백준 14891) 톱니바퀴 (골드.5)알고리즘 2022. 8. 2. 19:11
https://www.acmicpc.net/problem/14891
시뮬레이션 유형의 문제이다. 문제의 조건은 다음과 같다.
1) 1은 시계방향 -1은 반시계방향을 말한다.
2) 주어진 시계의 회전을 실시할 때에는 양옆의 시계와 맞닿은 부분을 확인하여 만약 서로 다른 극을 가지고 있으면 회전, 아니면 회전하지 않는다.
3) 서로 같은 극을 가진 시계를 만날 때까지 회전은 퍼져나간다.
4) 최종 시계의 모양에서 12시 방향의 극이 N극일 때 각각 1, 2, 4, 8점을 부여한다.
여기서 주의할 것은 맞닿은 시계가 회전할 때 각 시계의 회전 방향이 서로 반대로 이루어진다는 것이다.
회전이 이루어지지 않는 시점까지 양쪽으로 회전이 퍼져나가야 한다.
import sys global gear gear = [[] for _ in range(4)] for i in range(4): gear[i].extend([sys.stdin.readline(), 0]) k = int(sys.stdin.readline()) d = [] for _ in range(k): num, direction = map(int, sys.stdin.readline().split()) d.append((num-1, direction)) def rotation(num, direction) : global gear isCirculable = [0] * 4 tmp1, tmp2 = num-1, num+1 c1, c2 = direction*-1, direction * -1 isCirculable[num] = direction while tmp1>-1 : if gear[tmp1][0][(gear[tmp1][1] + 2)%8] == gear[tmp1+1][0][(gear[tmp1+1][1] + 6)%8]: break isCirculable[tmp1] = c1 c1 *= -1 tmp1 -= 1 while tmp2<4 : if gear[tmp2-1][0][(gear[tmp2-1][1] + 2)%8] == gear[tmp2][0][(gear[tmp2][1] + 6)%8]: break isCirculable[tmp2] = c2 c2 *= -1 tmp2 += 1 for index, c in enumerate(isCirculable) : if c == 0 : continue elif c == 1 : gear[index][1] = (gear[index][1]-1 + 8)%8 elif c == -1 : gear[index][1] = (gear[index][1]+1)%8 for di in d: rotation(di[0], di[1]) answer = 0 for i in range(4) : answer += (pow(2, i) * (gear[i][0][gear[i][1]]=='1')) print(answer)
'알고리즘' 카테고리의 다른 글
백준 14503) 로봇청소기 (골드.5) (0) 2022.08.02 백준 16234) 인구이동 (골드.5) (0) 2022.08.02 백준 15686) 치킨배달 (골드.5) (0) 2022.08.02 백준 17140) 이차원 배열과 연산 (골드.4) (0) 2022.08.02 백준 12865) 평범한 배낭 (골드.5) (0) 2022.07.20