반응형

https://www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴

www.acmicpc.net

문제 설명

문제에서 주어진 4개의 톱니바퀴를 규칙에 맞게 회전시키는 문제이다.

별다른 알고리즘 없이 문제에서 주어진 사항을 순서대로 구현만 하면 되는 문제이다.


풀이 과정

이 문제는 별다른 알고리즘 없이 문제에서 주어진 사항을 그대로 구현만 하면 되는 문제이다.

12시 방향을 0인덱스로 시작하여 11시 방향을 7 인덱스로 번호를 붙이기 때문에

현재 톱니바퀴의 왼쪽을 검사할 때는 [i][6] == [i-1][2] 인지 검사하면 되고

오른쪽을 검사할 때는 [i][2] == [i+1][6] 인지 검사하면 된다.

 

0과 3번째 톱니바퀴는 각각 오른쪽과 왼쪽만 검사하면 되지만

1, 2번째 톱니바퀴는 오른쪽 왼쪽 모두 검사해야 하므로 이 부분을 고려하여 코드를 작성하면 된다.

 

그리고, 현재 오른쪽의 톱니바퀴가 회전해야 한다면 연쇄적으로 모든 오른쪽 톱니바퀴를 고려해주어야 하고

왼쪽도 마찬가지이다.

 

def turn(idx, dir):
    if dir == 1:  # 시계
        wheel[idx][0], wheel[idx][1], wheel[idx][2], wheel[idx][3], wheel[idx][4], wheel[idx][5], wheel[idx][6], \
        wheel[idx][7] = \
            wheel[idx][7], wheel[idx][0], wheel[idx][1], wheel[idx][2], wheel[idx][3], wheel[idx][4], wheel[idx][5], \
            wheel[idx][6]
    else:  # 반시계
        wheel[idx][0], wheel[idx][1], wheel[idx][2], wheel[idx][3], wheel[idx][4], wheel[idx][5], wheel[idx][6], \
        wheel[idx][7] = \
            wheel[idx][1], wheel[idx][2], wheel[idx][3], wheel[idx][4], wheel[idx][5], wheel[idx][6], wheel[idx][7], \
            wheel[idx][0]


def solve(idx, dir):
    if idx == 0:
        if wheel[0][2] == wheel[1][6]:
            turn(0, dir)  # 0번만 턴
        else:
            if wheel[1][2] == wheel[2][6]:  # 0, 1번 턴
                turn(0, dir)
                turn(1, -dir)
            else:
                if wheel[2][2] == wheel[3][6]:  # 0, 1, 2번 턴
                    turn(0, dir)
                    turn(1, -dir)
                    turn(2, dir)
                else:  # 모두 다르기 때문에 턴
                    turn(0, dir)
                    turn(1, -dir)
                    turn(2, dir)
                    turn(3, -dir)

    elif idx == 1:
        if wheel[1][2] == wheel[2][6]:  # 1, 2번 톱니 같을 때
            if wheel[1][6] == wheel[0][2]:  # 0, 1번 톱니도 같으면
                turn(1, dir)  # 1번만 회전
            else:  # 0,1 은 다르면
                turn(1, dir)
                turn(0, -dir)

        else:  # 1, 2번 톱니 다를 때
            if wheel[1][6] == wheel[0][2]:  # 0, 1번 톱니는 같다면
                if wheel[2][2] == wheel[3][6]:
                    turn(1, dir)
                    turn(2, -dir)
                else:
                    turn(1, dir)
                    turn(2, -dir)
                    turn(3, dir)
            else:  # 0, 1번 톱니도 다르면
                if wheel[2][2] == wheel[3][6]:  # 2, 3번 톱니는 같다면
                    turn(0, -dir)
                    turn(1, dir)
                    turn(2, -dir)
                else:
                    turn(0, -dir)
                    turn(1, dir)
                    turn(2, -dir)
                    turn(3, dir)

    elif idx == 2:
        if wheel[2][6] == wheel[1][2]:  # 1, 2번 톱니 같을 때
            if wheel[2][2] == wheel[3][6]:  # 2, 3번 톱니도 같으면
                turn(2, dir)  # 2번만 회전
            else:  # 2, 3은 다르면
                turn(2, dir)
                turn(3, -dir)

        else:  # 1, 2번 톱니 다를 때
            if wheel[3][6] == wheel[2][2]:  # 2, 3번 톱니는 같다면
                if wheel[0][2] == wheel[1][6]:
                    turn(2, dir)
                    turn(1, -dir)
                else:
                    turn(0, dir)
                    turn(1, -dir)
                    turn(2, dir)
            else:  # 2, 3번 톱니도 다르면
                if wheel[0][2] == wheel[1][6]:  # 0, 1번 톱니는 같다면
                    turn(1, -dir)
                    turn(2, dir)
                    turn(3, -dir)
                else:
                    turn(0, dir)
                    turn(1, -dir)
                    turn(2, dir)
                    turn(3, -dir)

    else:
        if wheel[3][6] == wheel[2][2]:
            turn(3, dir)
        else:
            if wheel[1][2] == wheel[2][6]:
                turn(3, dir)
                turn(2, -dir)
            else:
                if wheel[1][6] == wheel[0][2]:
                    turn(3, dir)
                    turn(2, -dir)
                    turn(1, dir)
                else:
                    turn(3, dir)
                    turn(2, -dir)
                    turn(1, dir)
                    turn(0, -dir)


wheel = []
for i in range(4):
    wheel.append(list(map(int, input())))

k = int(input())
for i in range(k):
    a, b = map(int, input().split())
    solve(a - 1, b)

answer = 0
for i in range(4):
    if wheel[i][0] == 0:
        answer += 0
    else:
        answer += 2 ** i

print(answer)

https://github.com/HongEunho

전체 문제 & 코드는 위의 깃에 정리되어 있습니다.

팔로우 & 맞팔은 환영입니다 !

반응형

+ Recent posts