본문 바로가기
Algorithm(BOJ, Python)/Simulation

[백준_14891] 톱니바퀴 python

by kurooru 2022. 9. 17.

시뮬레이션이 짜증나는건,

분명 풀 수 있는데,

너무하기 귀찮다는 것 같다.

# 톱니바퀴의 정보를 담아 줄 리스트
gears = [0, [], [], [], []]

# 톱니바퀴 입력
for i in range(1, 5):
    gear = input()
    for j in gear:
        gears[i].append(int(j))

# 함수들
# is_connected(gear_front, gear_back)
def is_connected(gear_front, gear_back):
    return gears[gear_front][6] != gears[gear_back][2]

# cw(gear)
def cw(gear):

    # 전역 변수 선언
    global gears

    # temp
    temp = gears[gear][-1]

    # 돌려주기
    for i in range(7, 0, -1):
        gears[gear][i] = gears[gear][i-1]
    gears[gear][0] = temp

# ccw(gear)
def ccw(gear):

    # 전역 변수 선언
    global gears

    # temp
    temp = gears[gear][0]
    
    # 돌려주기
    for i in range(7):
        gears[gear][i] = gears[gear][i+1]
    gears[gear][-1] = temp

# k 입력
k = int(input())

for _ in range(k):
    # 회전할 톱니바퀴와 방향을 입력
    gear_num, dir = map(int, input().split())

    # 이번 턴에 회전시킬 톱니바퀴 번호와 방향을 담아 줄 리스트
    gears_about_to_change = [(gear_num, dir)]

    # gear 인덱싱용
    curr_gear_idx = gear_num

    # 현재 방향
    curr_gear_dir = dir

    # 왼쪽으로 이어져 있는 톱니바퀴 확인
    while True:
        
        # curr_idx가 1이거나 연결되어 있지 않으면,
        if curr_gear_idx == 1 or not is_connected(curr_gear_idx, curr_gear_idx - 1):
            # 반복문 종료,
            break

        # 이어져 있다면,
        elif is_connected(curr_gear_idx, curr_gear_idx - 1):
            # curr_gear_idx 와 curr_gear_dir 바꿔주고
            curr_gear_idx, curr_gear_dir = curr_gear_idx - 1, curr_gear_dir * -1
            # 회전시킬 톱니바퀴 리스트에 넣어주기
            gears_about_to_change.append((curr_gear_idx, curr_gear_dir))
    
    # gear 인덱스 초기화
    curr_gear_idx = gear_num

    # 현재 방향 초기화
    curr_gear_dir = dir

    # 오른쪽으로 이어져 있는 톱니바퀴 확인
    while True:

        # curr_idx가 4이거나 연결되어 있지 않으면,
        if curr_gear_idx == 4 or not is_connected(curr_gear_idx + 1, curr_gear_idx):
            # 반복문 종료
            break
            
        # 이어져 있다면,
        elif is_connected(curr_gear_idx + 1, curr_gear_idx):
            # curr_gear_idx 와 curr_gear_dir 바꿔주고
            curr_gear_idx, curr_gear_dir = curr_gear_idx + 1, curr_gear_dir * -1
            # 회전시킬 톱니바퀴 리스트에 넣어주기
            gears_about_to_change.append((curr_gear_idx, curr_gear_dir))
    
    # 회전시켜주기
    for change in gears_about_to_change:
        
        # 돌려줄 기어와 방향을 언팩킹
        change_gear, change_dir = change

        # 시계방향이라면,
        if change_dir == 1:
            # 시계방향으로 돌려주기
            cw(change_gear)
        
        # 반시계방향이라면,
        else:
            # 반시계뱡향으로 돌려주기
            ccw(change_gear)
        
# 점수 계산
point = 0

if gears[1][0]:
    point += 1
if gears[2][0]:
    point += 2
if gears[3][0]:
    point += 4
if gears[4][0]:
    point += 8

# 출력
print(point)