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)