반응형
Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

꿈과 열정

백준 15662 파이썬 : 톱니바퀴(2) 본문

알고리즘 문제풀이

백준 15662 파이썬 : 톱니바퀴(2)

dolchimdae 2022. 4. 27. 23:51
반응형

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() 에서 회전할 인덱스 기준으로 이동하되 배열범위를 넘거나 극이 같아 회전 수행이 불필요하면 끊긴다.

반응형
Comments