Algorithm(BOJ, Python)/Simulation
[백준_15662] 톱니바퀴2 python
kurooru
2022. 9. 18. 17:08
톱니바퀴 1에서
인덱싱 처리만 더 요하는 문제였다
개꿀 ㅋ
# t 입력
t = int(input())
# 톱니바퀴를 담아 줄 리스트
gears = [
[0] * 8
for _ in range(t)
]
# 톱니바퀴 담아주기
for i in range(t):
gear = input()
for j in range(8):
gears[i][j] = int(gear[j])
# 함수들
# is_connected(before_gear, after_gear)
def is_connected(before_gear, after_gear):
return gears[before_gear][2] != gears[after_gear][6]
# cw(change_num)
def cw(change_num):
# 전역 변수 선언
global gears
# 시계방향으로 돌려주기
temp = gears[change_num][-1]
for i in range(7, 0, -1):
gears[change_num][i] = gears[change_num][i-1]
gears[change_num][0] = temp
# ccw(change_num)
def ccw(change_num):
# 전역 변수 선언
global gears
# 반시계 방향으로 돌려주기
temp = gears[change_num][0]
for i in range(7):
gears[change_num][i] = gears[change_num][i+1]
gears[change_num][-1] = temp
# k 입력
k = int(input())
for _ in range(k):
# 바꿔 줄 톱니바퀴의 번호와 방향 입력
gear_num, dir = map(int, input().split())
gear_num -= 1
# 이번 턴에 바꿔 줄 톱니바퀴의 번호와 방향을 담아 줄 리스트
gears_about_to_change = [(gear_num, dir)]
# 왼쪽으로 연결 된 톱니바퀴 확인
# 현재 톱니바퀴 번호와 방향
curr_num, curr_dir = gear_num, dir
while True:
# 맨 앞 톱니바퀴이거나 연결되어 있지 않으면
if curr_num == 0 or not is_connected(curr_num - 1, curr_num):
# 탐색 종료
break
# 연결되어 있으면,
else:
# curr_num과 curr_dir 바꿔주고,
curr_num, curr_dir = curr_num - 1, curr_dir * -1
# 이번 턴에 바꿔 줄 리스트에 넣어줌
gears_about_to_change.append((curr_num, curr_dir))
# 오른쪽으로 연결 된 톱니바퀴 확인
# 현재 톱니바퀴 번호와 방향 초기화
curr_num, curr_dir = gear_num, dir
while True:
# 맨 뒤 톱니바퀴이거나 연결되어 있지 않으면,
if curr_num == t - 1 or not is_connected(curr_num, curr_num + 1):
# 탐색 종료
break
# 연결되어 있으면,
else:
# curr_num과 curr_dir 바꿔주고
curr_num, curr_dir = curr_num + 1, curr_dir * -1
# 이번 턴에 바꿔 줄 리스트에 넣어줌
gears_about_to_change.append((curr_num, curr_dir))
# 톱니바퀴 회전시켜주기
for change_gear in gears_about_to_change:
# 바꿔 줄 톱니바퀴의 번호와 바꿀 방향을 언팩킹
change_num, change_dir = change_gear
# 바꿔 줄 방향이 시계방향이라면,
if change_dir == 1:
# 시계 방향으로 돌려주기
cw(change_num)
# 바꿔 줄 방향이 반시계방향이라면,
else:
# 반시계방향으로 돌려주기
ccw(change_num)
# 정답 제출용
ans = 0
for gear in gears:
# 12시 방향이 S극이라면,
if gear[0]:
# 개수 추가
ans += 1
# 출력
print(ans)