코딩테스트
[Python] 백준 14891번 - 톱니바퀴
졍
2023. 8. 1. 19:49
문제: https://www.acmicpc.net/problem/14891
14891번: 톱니바퀴
첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터
www.acmicpc.net
문제를 보고 완전 구현으로 풀었다.
모든 톱니가 한번에 한칸씩만 움직이고, 톱니 바퀴의 개수가 총 4개로 고정되어있기 때문에, 각 경우의 수마다 직접 하드코딩(^^..)으로 문제를 해결했다.
하지만 만약 톱니의 개수가 더 많아진다면, 경우의 수에 대한 구현으로 풀면 코드가 너무 길어진다. (이미 200줄을 넘어간다)
풀이를 보니 톨릴 톱니바퀴로부터 가장 먼 톱니바퀴부터 극을 확인하며 dfs로 푸는 방법이 있었다.
다음 풀이에는 dfs를 활용해 풀어볼 예정이다.
gear = []
for _ in range(4):
gear.append(list(map(int, input())))
k = int(input())
rotation = [tuple(map(int, input().split())) for _ in range(k)]
def rotate_clockwise(gear):
new_gear = []
new_gear.append(gear[-1])
for i in range(0, 7):
new_gear.append(gear[i])
return new_gear
def rotate_counterclock(gear):
temp = gear[0]
gear.append(temp)
return gear[1:]
for i in range(k):
rotate_gear = rotation[i][0]-1
rotate_dir = rotation[i][1]
if rotate_gear == 0: # 첫째 기어
if gear[0][2] == gear[1][6]: # 첫번째가 같으면 1번 기어만 돌리기
if rotate_dir == 1:
gear[0] = rotate_clockwise(gear[0])
else:
gear[0] = rotate_counterclock(gear[0])
else:
if gear[1][2] == gear[2][6]: # 두번째가 같으면 1, 2번 기어 돌리기
if rotate_dir == 1:
gear[0] = rotate_clockwise(gear[0])
gear[1] = rotate_counterclock(gear[1])
else:
gear[0] = rotate_counterclock(gear[0])
gear[1] = rotate_clockwise(gear[1])
else:
if gear[2][2] == gear[3][6]: # 세번째가 같으면 1, 2, 3번 기어 돌리기
if rotate_dir == 1:
gear[0] = rotate_clockwise(gear[0])
gear[1] = rotate_counterclock(gear[1])
gear[2] = rotate_clockwise(gear[2])
else:
gear[0] = rotate_counterclock(gear[0])
gear[1] = rotate_clockwise(gear[1])
gear[2] = rotate_counterclock(gear[2])
else: # 세번째까지 다르면 1, 2, 3, 4번 기어 돌리기
if rotate_dir == 1:
gear[0] = rotate_clockwise(gear[0])
gear[1] = rotate_counterclock(gear[1])
gear[2] = rotate_clockwise(gear[2])
gear[3] = rotate_counterclock(gear[3])
else:
gear[0] = rotate_counterclock(gear[0])
gear[1] = rotate_clockwise(gear[1])
gear[2] = rotate_counterclock(gear[2])
gear[3] = rotate_clockwise(gear[3])
elif rotate_gear == 1: # 두번째 기어
if gear[1][6] == gear[0][2] and gear[1][2] == gear[2][6]:
if rotate_dir == 1:
gear[1] = rotate_clockwise(gear[1])
else:
gear[1] = rotate_counterclock(gear[1])
elif gear[1][6] != gear[0][2] and gear[1][2] == gear[2][6]:
if rotate_dir == 1:
gear[1] = rotate_clockwise(gear[1])
gear[0] = rotate_counterclock(gear[0])
else:
gear[1] = rotate_counterclock(gear[1])
gear[0] = rotate_clockwise(gear[0])
elif gear[1][6] == gear[0][2] and gear[1][2] != gear[2][6]:
if gear[2][2] == gear[3][6]:
if rotate_dir == 1:
gear[1] = rotate_clockwise(gear[1])
gear[2] = rotate_counterclock(gear[2])
else:
gear[1] = rotate_counterclock(gear[1])
gear[2] = rotate_clockwise(gear[2])
else:
if rotate_dir == 1:
gear[1] = rotate_clockwise(gear[1])
gear[2] = rotate_counterclock(gear[2])
gear[3] = rotate_clockwise(gear[3])
else:
gear[1] = rotate_counterclock(gear[1])
gear[2] = rotate_clockwise(gear[2])
gear[3] = rotate_counterclock(gear[3])
else:
if gear[2][2] == gear[3][6]:
if rotate_dir == 1:
gear[0] = rotate_counterclock(gear[0])
gear[1] = rotate_clockwise(gear[1])
gear[2] = rotate_counterclock(gear[2])
else:
gear[0] = rotate_clockwise(gear[0])
gear[1] = rotate_counterclock(gear[1])
gear[2] = rotate_clockwise(gear[2])
else:
if rotate_dir == 1:
gear[0] = rotate_counterclock(gear[0])
gear[1] = rotate_clockwise(gear[1])
gear[2] = rotate_counterclock(gear[2])
gear[3] = rotate_clockwise(gear[3])
else:
gear[0] = rotate_clockwise(gear[0])
gear[1] = rotate_counterclock(gear[1])
gear[2] = rotate_clockwise(gear[2])
gear[3] = rotate_counterclock(gear[3])
elif rotate_gear == 2: # 세번째 기어
if gear[2][6] == gear[1][2] and gear[2][2] == gear[3][6]:
if rotate_dir == 1:
gear[2] = rotate_clockwise(gear[2])
else:
gear[2] = rotate_counterclock(gear[2])
elif gear[2][6] == gear[1][2] and gear[2][2] != gear[3][6]:
if rotate_dir == 1:
gear[2] = rotate_clockwise(gear[2])
gear[3] = rotate_counterclock(gear[3])
else:
gear[2] = rotate_counterclock(gear[2])
gear[3] = rotate_clockwise(gear[3])
elif gear[2][6] != gear[1][2] and gear[2][2] == gear[3][6]:
if gear[0][2] == gear[1][6]:
if rotate_dir == 1:
gear[2] = rotate_clockwise(gear[2])
gear[1] = rotate_counterclock(gear[1])
else:
gear[2] = rotate_counterclock(gear[2])
gear[1] = rotate_clockwise(gear[1])
else:
if rotate_dir == 1:
gear[2] = rotate_clockwise(gear[2])
gear[1] = rotate_counterclock(gear[1])
gear[0] = rotate_clockwise(gear[0])
else:
gear[2] = rotate_counterclock(gear[2])
gear[1] = rotate_clockwise(gear[1])
gear[0] = rotate_counterclock(gear[0])
else:
if gear[0][2] == gear[1][6]:
if rotate_dir == 1:
gear[1] = rotate_counterclock(gear[1])
gear[2] = rotate_clockwise(gear[2])
gear[3] = rotate_counterclock(gear[3])
else:
gear[1] = rotate_clockwise(gear[1])
gear[2] = rotate_counterclock(gear[2])
gear[3] = rotate_clockwise(gear[3])
else:
if rotate_dir == 1:
gear[0] = rotate_clockwise(gear[0])
gear[1] = rotate_counterclock(gear[1])
gear[2] = rotate_clockwise(gear[2])
gear[3] = rotate_counterclock(gear[3])
else:
gear[0] = rotate_counterclock(gear[0])
gear[1] = rotate_clockwise(gear[1])
gear[2] = rotate_counterclock(gear[2])
gear[3] = rotate_clockwise(gear[3])
elif rotate_gear == 3: # 네번째 기어
if gear[2][2] == gear[3][6]:
if rotate_dir == 1:
gear[3] = rotate_clockwise(gear[3])
else:
gear[3] = rotate_counterclock(gear[3])
else:
if gear[1][2] == gear[2][6]:
if rotate_dir == 1:
gear[2] = rotate_counterclock(gear[2])
gear[3] = rotate_clockwise(gear[3])
else:
gear[2] = rotate_clockwise(gear[2])
gear[3] = rotate_counterclock(gear[3])
else:
if gear[0][2] == gear[1][6]:
if rotate_dir == 1:
gear[1] = rotate_clockwise(gear[1])
gear[2] = rotate_counterclock(gear[2])
gear[3] = rotate_clockwise(gear[3])
else:
gear[1] = rotate_counterclock(gear[1])
gear[2] = rotate_clockwise(gear[2])
gear[3] = rotate_counterclock(gear[3])
else:
if rotate_dir == 1:
gear[0] = rotate_counterclock(gear[0])
gear[1] = rotate_clockwise(gear[1])
gear[2] = rotate_counterclock(gear[2])
gear[3] = rotate_clockwise(gear[3])
else:
gear[0] = rotate_clockwise(gear[0])
gear[1] = rotate_counterclock(gear[1])
gear[2] = rotate_clockwise(gear[2])
gear[3] = rotate_counterclock(gear[3])
answer = 0
if gear[0][0] == 1:
answer += 1
if gear[1][0] == 1:
answer += 2
if gear[2][0] == 1:
answer += 4
if gear[3][0] == 1:
answer += 8
print(answer)