꿈과 열정
백준 15662 파이썬 : 톱니바퀴(2) 본문
반응형
https://www.acmicpc.net/problem/15662
15662번: 톱니바퀴 (2)
총 8개의 톱니를 가지고 있는 톱니바퀴 T개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴
www.acmicpc.net
고조선 건국 때에 이 문제를 풀기 시작하여... 마침내 자력으로 풀어냈다. (엄청 오래 걸렸단 뜻)
🥹
< 설명 >
바퀴를 회전해야할지 체크하는 checker(), 해당되는 톱니 바퀴를 회전시키는 rotate() 함수로 역할을 나눴다.
1. checker() 는 회전할 톱니와 방향을 인수로 한방향으로의 톱니들을 체크해,
회전할 톱니바퀴의 번호와 방향 배열을 반환한다.
2. 양방향을 체크해 회전할 [톱니번호, 방향 ]을 배열 rotates에 모은다.
3. rotates[] 를 돌며 rotate()를 실행한다.
회전을 완료한 톱니바퀴들의 0번째 요소를 확인해 답을 구한다 !
< 소스 코드 >
# n = 0 , s = 1
# 1 = 시계 , -1= 반시계
# 2번 6번 끼리 확인. 돌린 후 0번 위치가 1(S)인 개수
# 0~7
def checker(data,dir,t,n,lr):
result = []
i = n
if lr == 1: # 오른쪽
while i < t-1:
# print("오른쪽으로~~")
if data[i][2] != data[i+1][6]:
dir = -dir
result.append([i+1,dir])
i += 1
else:
break
if lr == -1: # 왼쪽
while i > 0:
# print("왼쪽으로 ~~")
if data[i][6] != data[i-1][2]:
dir = -dir
result.append([i-1,dir])
i -= 1
else:
break
return result
def rotate(data,dir):
if dir == 1:
temp = data[-1]
data[1:8] = data[:7]
data[0] = temp
return data
else:
temp = data[0]
data[:7] = data[1:8]
data[-1] = temp
return data
t = int(input())
data = []
for i in range(t):
data.append(list(map(int,input())))
k = int(input())
for i in range(k):
n,d = map(int,input().split())
rotates = [[n-1,d]]
rotates += checker(data,d,t,n-1,1)
rotates += checker(data,d,t,n-1,-1)
# 돌릴 톱니바퀴,방향 모음
# print("rotates",rotates)
for n,d in rotates:
data[n] = rotate(data[n],d)
# for d in data:
# x = map(str,d)
# print(''.join(x))
result = 0
for d in data:
if d[0] == 1:
result += 1
print(result)
< 참고 > 작업 수행 단계가 보이게 print 문을 추가한 예제1 출력 결과.
O쪽으로 : checker() 에서 회전할 인덱스 기준으로 이동하되 배열범위를 넘거나 극이 같아 회전 수행이 불필요하면 끊긴다.
반응형
'알고리즘 문제풀이' 카테고리의 다른 글
백준 1261 파이썬 : 알고스팟 (0) | 2022.05.04 |
---|---|
백준 7576 파이썬 : 토마토 (0) | 2022.04.28 |
백준 11052 파이썬 : 카드 구매하기 (0) | 2022.04.26 |
백준 6588 파이썬 : 골드바흐의 추측 (feat. 에라토스테네스의 체) (0) | 2022.04.23 |
백준 17299 파이썬 : 오등큰수 (0) | 2022.04.21 |
Comments