728x90

백준 14891 - 톱니바퀴

시간 제한 2초, 메모리 제한 512MB

# 조건

입력

  • 첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다.
  • 상태는 8개의 정수로 이루어져 있고, 12시방향부터 시계방향 순서대로 주어진다. N극은 0, S극은 1로 나타나있다.
  • 다섯째 줄에는 회전 횟수 K(1 ≤ K ≤ 100)가 주어진다.
  • 다음 K개 줄에는 회전시킨 방법이 순서대로 주어진다.
  • 각 방법은 두 개의 정수로 이루어져 있고, 첫 번째 정수는 회전시킨 톱니바퀴의 번호, 두 번째 정수는 방향이다.
    • 방향이 1인 경우는 시계 방향이고, -1인 경우는 반시계 방향이다.

출력

  • 총 K번 회전시킨 이후에 네 톱니바퀴의 점수의 합을 출력한다.
    • 점수란 다음과 같이 계산한다.
  • 1번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 1점
  • 2번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 2점
  • 3번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 4점
  • 4번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 8점

# 접근 방법

  • 구현문제인만큼 조건을 잘 확인하고 로직을 구현하는데 집중하였다.
  • 우선 4개의 톱니바퀴를 회전시키기 편하게 deque로 생성해주고, 각각의 초기 상태를 기록해준다.
  • command를 입력받은 후 순회하면 되는데 주의할 점은 회전 시키는 바퀴를 기준으로 회전 방향을 주의해주어야 한다.
  • 따라서, 1 2 3 4 중 어떤 톱니바퀴를 돌리느냐에 따라서 rotate 함수에 넣어줄 방향이 달라진다.
  • 1번을 예시로 들면,
    • 1번과 2번의 맞물리는 번호를 확인 후
    • 다르다면 2번과 3번,
    • 다르다면 3번과 4번을 차례로 조건문으로 확인해준 후 rotate(번호, 방향)을 수행해주면 된다.
  • 또한 점수가 바퀴마다 다르므로 확인 후 곱하기 연산을 통해 구해주었다.
import sys
sys.stdin = open('input.txt')
input = sys.stdin.readline
from collections import deque

def rotate(n, d):
    if n == 1:
        info1.rotate(1) if d == 1 else info1.rotate(-1)
    elif n == 2:
        info2.rotate(1) if d == 1 else info2.rotate(-1)
    elif n == 3:
        info3.rotate(1) if d == 1 else info3.rotate(-1)
    elif n == 4:
        info4.rotate(1) if d == 1 else info4.rotate(-1)

info1, info2, info3, info4 = deque(), deque(), deque(), deque()
inp = input().strip()
for i in inp:
    info1.append(i)
inp = input().strip()
for i in inp:
    info2.append(i)
inp = input().strip()
for i in inp:
    info3.append(i)
inp = input().strip()
for i in inp:
    info4.append(i)

N = int(input())
command = [list(map(int, input().split())) for _ in range(N)]

for c in command:
    num, dir = c
    if num == 1:
        if info1[2] != info2[6]:
            if info2[2] != info3[6]:
                if info3[2] != info4[6]:
                    rotate(4, -dir)
                rotate(3, dir)
            rotate(2, -dir)
        rotate(1, dir)

    elif num == 2:
        if info1[2] != info2[6]:
            rotate(1, -dir)
        if info2[2] != info3[6]:
            if info3[2] != info4[6]:
                rotate(4, dir)
            rotate(3, -dir)
        rotate(2, dir)

    elif num == 3:
        if info2[2] != info3[6]:
            if info1[2] != info2[6]:
                rotate(1, dir)
            rotate(2, -dir)
        if info3[2] != info4[6]:
            rotate(4, -dir)
        rotate(3, dir)

    elif num == 4:
        if info3[2] != info4[6]:
            if info2[2] != info3[6]:
                if info1[2] != info2[6]:
                    rotate(1, -dir)
                rotate(2, dir)
            rotate(3, -dir)
        rotate(4, dir)

result = 0
result += int(info1[0]) * 1 + int(info2[0]) * 2 + int(info3[0]) * 4 + int(info4[0]) * 8
print(result)
728x90