톱니바퀴 4개 일렬로
k번 회전
A를 회전시킬 때
옆에 있는 톱니바퀴 B와 맞닿은 톱니의 극이 다르면 (A랑 B의 톱니가)
예를들어 다음과 같은 경우가 있으면
두 톱니바퀴 맞닿은 부분이 초록색 점선일 때
from collections import deque
| help(deque) 하면
| rotate(...)
| Rotate the deque n steps to the right (default n=1). If n is negative, rotates left.
뭐 rotate()함수 쓰면 돌리는건 될거같은데
recursive하게 연쇄적으로 돌려줘야하는게 조금 관건이네
대충 이렇게 접근하려 했는데
def turn_wheel(wheel_idx, direction):
# 양옆 바퀴를 체크해야함 (이때 걔랑 맞닿는 부분) + 1234번에 따라 체크할 상대가 다름
if wheel_idx == 0:
# 다른 극이면 --> 옆 바퀴를 회전시킨다. --> 회전시키기 전에 걔의 옆에꺼를 체크해야한다!!!
if wheels[wheel_idx][2] != wheels[wheel_idx+1][6]:
turn_wheel(wheel_idx+1, direction * (-1)) # 옆 바퀴 인덱스랑 방향 반대로 넘겨줌 (중요)
else:
옆에 바퀴는 회전시키지 않음
돌아와서 wheel_idx를 direction방향으로 회전
elif wheel_idx == 1 or wheel_idx == 2:
# 왼쪽 바퀴 확인
# 다른 극이면 --> 옆 바퀴를 회전시킨다. --> 회전시키기 전에 걔의 옆에꺼를 체크해야한다!!!
if wheels[wheel_idx][6] != wheels[wheel_idx-1][2]:
turn_wheel(wheel_idx-1, direction * (-1)) # 옆 바퀴 인덱스랑 방향 반대로 넘겨줌 (중요)
else:
옆에 바퀴는 회전시키지 않음
돌아와서 wheel_idx를 direction방향으로 회전
# 오른쪽 바퀴 확인
# 다른 극이면 --> 옆 바퀴를 회전시킨다. --> 회전시키기 전에 걔의 옆에꺼를 체크해야한다!!!
if wheels[wheel_idx][2] != wheels[wheel_idx+1][6]:
turn_wheel(wheel_idx+1, direction * (-1)) # 옆 바퀴 인덱스랑 방향 반대로 넘겨줌 (중요)
else:
옆에 바퀴는 회전시키지 않음
돌아와서 wheel_idx를 direction방향으로 회전
else:
마찬가지로 진행
for k
처음으로 회전시킬 바퀴를 회전하기 전에!!
turn_wheel(turn[0], turn[1])
# (필요없을듯??) 끝나고 돌아와서 wheels[turn[0]]을 rotate(turn[1])에 대해 한칸 돌려 <-- 이때 rotate() 파라미터 음수면 왼쪽으로임
answer = 0
if wheels[0][0] == 1: answer += 1
if wheels[1][0] == 1: answer += 2
if wheels[2][0] == 1: answer += 4
if wheels[3][0] == 1: answer += 8
print(answer)
from collections import deque
''' 애초에 처음 돌릴때랑 그 다음부터 연쇄적으로 돌릴 때 구분했어야함'''
''' 처음 돌릴 때 2,3번째면 양옆을 다 봐야하는데, 그 다음부턴 한쪽방향으로만 쭉 가야함 => 안그럼 리커전 깊어져서 에러'''
def turn_wheel(wheel_idx, direction, gogo):
# 양옆 바퀴를 체크해야함 (이때 걔랑 맞닿는 부분) + 1234번에 따라 체크할 상대가 다름
if wheel_idx == 0:
# 1번 바퀴는 2번바퀴만 체크하고, 2번바퀴와 같은 톱니면 회전시킬 필요 X
if wheels[wheel_idx][2] == wheels[wheel_idx+1][6]:
return
# 왼쪽 바퀴 확인
elif (wheel_idx == 1 or wheel_idx == 2) and gogo == "left":
if wheels[wheel_idx][6] != wheels[wheel_idx-1][2]:
turn_wheel(wheel_idx-1, direction * (-1), "left")
# 오른쪽 바퀴 확인
elif (wheel_idx == 1 or wheel_idx == 2) and gogo == "right":
if wheels[wheel_idx][2] != wheels[wheel_idx+1][6]:
turn_wheel(wheel_idx+1, direction * (-1), "right")
elif wheel_idx == 3:
# 4번 바퀴는 3번바퀴만 체크하고, 3번바퀴와 같은 톱니면 회전시킬 필요 X
if wheels[wheel_idx][6] == wheels[wheel_idx-1][2]:
return
#돌아와서 wheel_idx를 direction방향으로 회전
wheels[wheel_idx].rotate(direction)
global wheels
wheels = []
for _ in range(4):
wheel = deque(list(input()))
wheels.append(wheel)
k = int(input())
num_k = [list(map(int, input().split())) for _ in range(k)]
# 회전시킬만큼 기기
for turn in turn_k:
# index는 0부터 시작이므로 -1해줘야 안꼬임
wheel_idx = turn[0]-1
direction = turn[1]
# 양옆 바퀴를 체크해야함 (이때 걔랑 맞닿는 부분) + 1234번에 따라 체크할 상대가 다름
if wheel_idx == 0:
# 다른 극이면 --> 옆 바퀴를 회전시킨다. --> 회전시키기 전에 걔의 옆에꺼를 체크해야한다!!!
if wheels[wheel_idx][2] != wheels[wheel_idx+1][6]:
turn_wheel(wheel_idx+1, direction * (-1), "right") # 옆 바퀴 인덱스랑 방향 반대로 넘겨줌 (중요)
elif wheel_idx == 1 or wheel_idx == 2:
# 왼쪽 바퀴 확인 - 둘다확인
if wheels[wheel_idx][6] != wheels[wheel_idx-1][2]:
turn_wheel(wheel_idx-1, direction * (-1), "left") # 옆 바퀴 인덱스랑 방향 반대로 넘겨줌 (중요)
# 오른쪽 바퀴 확인 - 둘다확인
if wheels[wheel_idx][2] != wheels[wheel_idx+1][6]:
turn_wheel(wheel_idx+1, direction * (-1), "right") # 옆 바퀴 인덱스랑 방향 반대로 넘겨줌 (중요)
else:
if wheels[wheel_idx][6] != wheels[wheel_idx-1][2]:
turn_wheel(wheel_idx-1, direction * (-1), "left") # 옆 바퀴 인덱스랑 방향 반대로 넘겨줌 (중요)
#돌아와서 wheel_idx를 direction방향으로 회전
wheels[wheel_idx].rotate(direction)
answer = 0
if wheels[0][0] == str(1):
answer += 1
if wheels[1][0] == str(1):
answer += 2
if wheels[2][0] == str(1):
answer += 4
if wheels[3][0] == str(1):
answer += 8
print(answer)
2번테케 실행결과
3번테케 실행결과 (틀림 ㅜㅜ)