문제 설명
https://www.acmicpc.net/problem/14891
문제 풀이
turn 메소드를 통해 반시계 방향과 시계 방향으로 돌려주는 작업을 해주었다.
인덱스로 확인하기 때문에 회전하는 톱니를 받고 -1를 해주었고(n -= 1)
d 배열로 톱니마다 방향을 저장해주었다.
처음에는 if문으로 1번 톱니일 때, 2번 톱니일 때,,, 하나씩 처리해주려고 했는데
if문 중첩이 너무 많아져서 어지럽길래 다른 방법을 생각해보았다.
왼쪽으로 확인해야 될 톱니가 있을 때 (2번, 3번, 4번)
왼쪽으로 하나씩 확인하며 극이 다를 때 방향을 지정해주었다.
극이 같을 때는 이후의 왼쪽 톱니들도 회전을 안 하기 때문에 break를 걸어주었음!
오른쪽으로 확인해야 할 톱니가 있을 때 (1번, 2번, 3번)도 마찬가지로 같은 방법으로 처리해주었다.
gear = [list(map(int, input())) for _ in range(4)]
k = int(input())
case = [list(map(int, input().split())) for _ in range(k)]
result = 0
def turn(arr, f):
if f == 1:
return arr[7:8] + arr[0:7]
elif f == -1:
return arr[1:8] + arr[0:1]
return arr
for i in range(k):
n, flag = case[i]
n -= 1
d = [0, 0, 0, 0]
d[n] = flag
if n != 0: # 왼쪽으로 확인해야 할 톱니가 있을 때 (2, 3, 4)
# 회전하는 톱니의 왼쪽 톱니부터 1번 톱니까지 확인
for l in range(n - 1, -1, -1):
if gear[l][2] != gear[l + 1][6]:
d[l] = d[l + 1] * -1
else: # 극이 같을 때 회전하지 않으므로 다음 톱니들은 확인할 필요 없음.. !
break
if n != 3: # 오른쪽으로 확인해야 할 톱니가 있을 때 (1, 2, 3)
# 회전하는 톱니의 오른쪽 톱니부터 4번 톱니까지 확인
for r in range(n, 3):
if gear[r][2] != gear[r + 1][6]:
d[r + 1] = d[r] * -1
else: # 극이 같을 때 회전하지 않으므로 다음 톱니들은 확인할 필요 없음.. !
break
for t in range(4):
gear[t] = turn(gear[t], d[t])
for i in range(4):
result += 2 ** i * gear[i][0]
print(result)
'알고리즘 > 백준' 카테고리의 다른 글
[백준`S1] 2564 - 경비원 (Python) (1) | 2024.03.05 |
---|---|
[백준`S2] 10971 - 외판원 순회 2 (Python) (0) | 2024.02.29 |
[백준`S1] 12852 - 1로 만들기 2 (Python) (0) | 2023.11.24 |
[백준`S1] 1149 - RGB거리 (Python) (0) | 2023.11.22 |
[백준] 2579 - 계단 오르기 (Python) (1) | 2023.11.21 |