코딩테스트

[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)