728x90
시간 제한 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
'ALGORITHM > 정렬, 탐색,구현' 카테고리의 다른 글
[백준 1138번] 파이썬 - 한 줄로 서기 (0) | 2024.03.19 |
---|---|
[백준 19948번] 파이썬 - 음유시인 영재 (2) | 2024.03.14 |
[백준 11256번] 파이썬 - 사탕 (0) | 2024.03.04 |
[백준 15970번] 파이썬 - 화살표 그리기 (0) | 2024.02.03 |
[백준 16927번] 파이썬 - 배열 돌리기2 (2) | 2024.01.28 |