[백준] q15662 톱니바퀴 (2)

1 분 소요

문제

T개의 톱니바퀴의 상태가 주어진다. N극은 0, S극은 1로 나타나있다. 그리고 주어진 회전 횟수 K만큼 회전시킨 톱니바퀴의 번호와 방향이 주어진다. 방향이 1인 경우는 시계 방향이고, -1인 경우는 반시계 방향이다.

톱니바퀴 A가 회전할 때, 그 옆에 있는 톱니바퀴 B와 맞닿는 톱니의 극이 다르다면, 톱니바퀴 A와 반대방향으로 톱니바퀴 B를 회전한다.

총 K번 회전시킨 이후에 12시 방향이 S극인 톱니바퀴의 개수를 출력하라.

어떻게 풀 것인가?

  1. T개의 톱니바퀴의 초기 상태와 톱니바퀴를 회전시킨 방법을 입력받는다.
  2. 톱니바퀴 A를 회전시켰을 때, 다른 톱니바퀴를 회전시키는 방향을 구한다.
  3. 톱니바퀴의 상태를 업데이트한다.
  4. 총 K번 회전시킨 이후 결과를 출력한다.
# T개의 톱니바퀴의 초기 상태를 입력받는다.
gears = []
t = int(input())
for _ in range(t):
    gears.append(input())

# 톱니바퀴를 회전시킨 방법을 입력받는다.
k = int(input())
rotation_seq = []
for _ in range(k):
    num, direc = map(int, input().split())  # 회전시킨 톱니바퀴의 번호, 방향(1: 시계 방향, -1: 반시계 방향)
    rotation_seq.append([num - 1, direc])

# 톱니바퀴 A를 회전시켰을 때, 다른 톱니바퀴를 회전시키는 방향을 구한다.
for i in range(k):
    state = [0] * t
    state[rotation_seq[i][0]] = rotation_seq[i][1]

    for j in range(rotation_seq[i][0], t - 1, 1):
        if gears[j][2] != gears[j+1][6]:
            state[j + 1] = -state[j]

    for j in range(rotation_seq[i][0]-1, -1, -1):
        if gears[j][2] != gears[j+1][6]:
            state[j] = -state[j+1]

    # 톱니바퀴의 상태를 업데이트한다.
    for nu in range(t):
        if state[nu] == 1:
            gears[nu] = gears[nu][7] + gears[nu][0:7]
        elif state[nu] == -1:
            gears[nu] = gears[nu][1:8] + gears[nu][0]
        else:
            continue

# 톱니바퀴의 개수 계산
cnt = 0
for i in range(t):
    if gears[i][0] == '1':
        cnt += 1

# 결과 출력
print(cnt)

카테고리:

업데이트:

댓글남기기