https://www.acmicpc.net/problem/14891
14891번: 톱니바퀴
총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴
www.acmicpc.net
아이디어
요구사항에 맞게 구현하는 문제였다.
처음에는 문제를 잘못 이해해서 1시간동안 연쇄 반응으로 회전하는 (회전 후 근처 톱니바퀴의 극이 다르면 회전..) 코드를 작성했는데, 알고보니 처음 상태에서 회전할 톱니바퀴와 방향만 알아낸 뒤 회전하는거였다.
rotaion 메서드: 회전
우선 회전하는 메서드는 회전할 톱니바퀴 정보와 방향을 받도록 했다.
def rotation(n, d):
if d == -1: #반시계 방향으로 회전
tmp_gear = gears[n][0]
for i in range(7): gears[n][i] = gears[n][i+1]
gears[n][7] = tmp_gear
if d == 1: #시계 방향으로 회전
tmp_gear = gears[n][7]
for i in range(7, 0, -1): gears[n][i] = gears[n][i-1]
gears[n][0] = tmp_gear
return
스왑해주는 로직을 그대로 사용했다.
회전할 톱니바퀴 정보와 방향 정보 얻기
연쇄가 아닌 한 큐에 돌리는거기 때문에 먼저 회전할 톱니바퀴와 방향 정보를 얻어준다.
rs = [(n,d)]
rdir = -d
for i in range(n, 0, -1):
if gears[i][6] != gears[i-1][2]:
rs.append((i-1, rdir))
rdir = -rdir
continue
break
rdir = -d
for i in range(n, 3):
if gears[i][2] != gears[i+1][6]:
rs.append((i+1, rdir))
rdir = -rdir
continue
break
rs에 처음에 들어온 정보를 먼저 넣어준 뒤, 회전할 톱니바퀴를 기준으로 왼쪽에 있는 톱니바퀴의 회전 정보를 먼저 검사한다.
만약 극이 같아 회전하지 않아도 된다면 break으로 반복문을 탈출해준다.
오른쪽에 있는 톱니바퀴의 회전정보도 같은 방법으로 얻는다.
그 후 rs에 있는 정보대로 한꺼번에 rotation 하면 된다.
for x, y in rs:
rotation(x, y)
전체 코드
# s = 1, n = 0
def rotation(n, d):
if d == -1: #반시계 방향으로 회전
tmp_gear = gears[n][0]
for i in range(7): gears[n][i] = gears[n][i+1]
gears[n][7] = tmp_gear
if d == 1: #시계 방향으로 회전
tmp_gear = gears[n][7]
for i in range(7, 0, -1): gears[n][i] = gears[n][i-1]
gears[n][0] = tmp_gear
return
def solution(n, d):
rs = [(n,d)]
rdir = -d
for i in range(n, 0, -1):
if gears[i][6] != gears[i-1][2]:
rs.append((i-1, rdir))
rdir = -rdir
continue
break
rdir = -d
for i in range(n, 3):
if gears[i][2] != gears[i+1][6]:
rs.append((i+1, rdir))
rdir = -rdir
continue
break
for x, y in rs:
rotation(x, y)
gears = [[int(x) for x in input()] for _ in range(4)]
K = int(input()) # 회전 횟수
info = [tuple(map(int, input().split())) for _ in range(K)]
for n, d in info: solution(n-1, d)
answer = 0
for i in range(4):
if gears[i][0] == 1:
answer += 2**i
print(answer)
문제를 제대로 파악하고 나서는 기존 코드를 고치며 솔브까지 21분 정도 걸렸다. ...다음부터는 문제를 꼼꼼히 읽어야겠다...ㅠㅠ
'Coding Test > Python' 카테고리의 다른 글
[백준] 15685번: 드래곤 커브(골드3, 파이썬) (1) | 2024.01.02 |
---|---|
[백준] 15683번: 감시 (골드4, 파이썬) (0) | 2024.01.02 |
[백준] 14890번: 경사로 (골드3, 파이썬) (0) | 2023.12.30 |
[LeetCode 75] 1071. Greatest Common Divisor of Strings (easy, python) (1) | 2023.12.30 |
[LeetCode 75] 1768. Merge Strings Alternately (easy, python) (0) | 2023.12.30 |