반응형
https://www.acmicpc.net/problem/14891
문제 설명
문제에서 주어진 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 |