t = int(input())
gear = [[0]*8 for _ in range(t)]
rotate_list = []
answer = 0
for i in range(t):
gear[i] = list(map(int,list(input())))
def rotate_right(lst): # 시계 방향으로 회전시키는 함수
lst.insert(0,lst.pop())
def rotate_left(lst): # 반시계 방향으로 회전시키는 함수
lst.append(lst.pop(0))
k = int(input())
for i in range(k): # 회전 목록 입력받고 저장
number, direction = map(int,input().split())
rotate_list.append((number-1,direction,"both"))
def rotate(index,d): # 주어진 방향으로 회전시키는 함수
if d == 1:
rotate_right(gear[index])
elif d == -1:
rotate_left(gear[index])
def propagation(n,direct,prop_direct): # 회전 전파시키는 함수
if prop_direct == "both": # 회전 전파 방향이 양쪽 일때
if n - 1 >= 0 and gear[n][6] != gear[n-1][2]: # 서로 극이 다른 경우 왼쪽으로 전파(재귀방식)
propagation(n-1,-direct,"left")
if n + 1 < t and gear[n][2] != gear[n+1][6]: # 서로 극이 다른 경우 오른쪽으로 전파(재귀방식)
propagation(n+1,-direct,"right")
elif prop_direct == "left": # 회전 전파 방향이 왼쪽 일때
if n - 1 >= 0 and gear[n][6] != gear[n-1][2]: # 서로 극이 다른 경우 왼쪽으로 전파(재귀방식)
propagation(n-1,-direct,"left")
elif prop_direct == "right": # 회전 전파 방향이 오른쪽 일때
if n + 1 < t and gear[n][2] != gear[n+1][6]: # 서로 극이 다른 경우 오른쪽으로 전파(재귀방식)
propagation(n+1,-direct,"right")
rotate(n,direct) # 회전
for gear_index,rotate_d, rotate_prop in rotate_list:
propagation(gear_index,rotate_d,rotate_prop)
for i in range(t): # 점수 계산
if gear[i][0] == 1:
answer += 1
print(answer)
이번 문제는 바로 이전에 풀이했던 톱니바퀴 문제(https://woohyun-king.tistory.com/200)와 거의 유사한 문제이다.(구체적인 문제풀이를 참고하고자 한다면 해당 링크를 참고하길 바란다.)
다만 톱니바퀴의 개수가 4개가 아니라 임의의 값 T개를 가진다는 점과, 점수 계산방법이 조금 다르다는 차이점이 존재하는데, 로직 상으로는 완전히 동일하다.
이전에 톱니바퀴 문제를 풀이했을 때 4개의 톱니바퀴를 각각 비교하면서 구현하는 하드코딩 방식이 아니라, 재귀함수를 사용하여 풀이하였더니 톱니바퀴의 개수만 수정하여 간단하게 풀이할 수 있었다 :)
'Algorithm 💡 > Implementation' 카테고리의 다른 글
[백준 21610번] 마법사 상어와 비바라기 (0) | 2023.08.15 |
---|---|
[백준 14503번] 로봇 청소기 (0) | 2023.08.09 |
[백준 14891번] 톱니바퀴 (0) | 2023.08.09 |
[백준 3190번] 뱀 (0) | 2023.08.06 |
[백준 21608번] 상어 초등학교 (0) | 2023.07.31 |