반응형
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)
전체 문제 & 코드는 위의 깃에 정리되어 있습니다.
팔로우 & 맞팔은 환영입니다 !
반응형
'Algorithm > Implementation' 카테고리의 다른 글
[백준] 21611 마법사 상어와 블리자드 (Python 파이썬) (0) | 2021.10.21 |
---|---|
[백준] 21610 마법사 상어와 비바라기 (0) | 2021.10.20 |
[백준] 14503 로봇 청소기 (Python 파이썬) (0) | 2021.10.19 |
[백준] 14500 테트로미노 (Python 파이썬) (0) | 2021.10.16 |
[백준] 14499 주사위 굴리기 (Python 파이썬) (0) | 2021.10.15 |