https://www.acmicpc.net/problem/14891
문제 해결을 위한 과정
이 문제의 경우 역시 마찬가지로 구현 문제이므로 차분하게 조건을 작성하면 해결할 수 있었다. 돌리게 되는 톱니를 기준으로 좌측 영역, 우측 영역을 분리하여 각자 맞게 회전을 시켜주었다. 다만 이때 flagLeft(왼쪽에 맞물리는 부분) flagRight(우측에 맞물리는 부분)을 for문 내부에 그대로 넣어서 덮어진 값을 사용하게 되어 틀렸습니다. 를 받게 되었다. 따라서 tempFlagLeft, tempFlagRight로 분리하여 덮어씌워짐을 방지 하였다.
소스코드
arr = [[] for _ in range(4)]
for i in range(4):
tempArr = input()
for j in range(len(tempArr)):
arr[i].append(int(tempArr[j]))
k = int(input())
moves = []
for _ in range(k):
a, b = map(int, input().split())
moves.append((a, b))
def turn_right(array):
right = array[7]
for i in range(6, -1, -1):
array[i + 1] = array[i]
array[0] = right
def turn_left(array):
left = array[0]
for i in range(0, 7):
array[i] = array[i + 1]
array[7] = left
for x in range(k):
num, dir = moves[x]
num -= 1 # index 맞추기 위함
flagLeft = arr[num][6]
flagRight = arr[num][2]
if dir == 1:
turn_right(arr[num])
else:
turn_left(arr[num])
tempDir = dir
tempFlagLeft = flagLeft
tempFlagRight = flagRight
for i in range(num-1, -1, -1):
if tempFlagLeft != arr[i][2]:
if tempDir == 1:
tempFlagLeft = arr[i][6]
tempFlagRight = arr[i][2]
turn_left(arr[i])
tempDir *= -1
else:
tempFlagLeft = arr[i][6]
tempFlagRight = arr[i][2]
turn_right(arr[i])
tempDir *= -1
else:
break
tempDir = dir
tempFlagLeft = flagLeft
tempFlagRight = flagRight
for i in range(num + 1, 4):
if tempFlagRight != arr[i][6]:
if tempDir == -1:
tempFlagLeft = arr[i][6]
tempFlagRight = arr[i][2]
turn_right(arr[i])
tempDir *= -1
else:
tempFlagLeft = arr[i][6]
tempFlagRight = arr[i][2]
turn_left(arr[i])
tempDir *= -1
else:
break
ans = 0
for i in range(len(arr)):
if arr[i][0] == 1:
if i == 0:
ans += 1
elif i == 1:
ans += 2
elif i == 2:
ans += 4
else:
ans += 8
print(ans)
'알고리즘 > 백준' 카테고리의 다른 글
백준 20055번: 컨베이어 벨트 위의 로봇(Python) (0) | 2024.04.08 |
---|---|
백준 9663번: N-Queen(Python) (0) | 2024.04.06 |
백준 21608번: 상어 초등학교(Python) (0) | 2024.04.03 |
백준 21610번: 마법사 상어와 비바라기(Python) (0) | 2024.04.02 |
백준 1238번: 파티(Python, cpp) (0) | 2022.02.27 |