머신러닝 개발자의 러닝머신

14891: 톱니바퀴 (Python) 본문

알고리즘/boj

14891: 톱니바퀴 (Python)

oongsong 2022. 7. 27. 10:18
반응형

<문제 유형> : 구현 

 ☞ 문제 상황을 논리적, 체계적으로 구현하는 문제이다.

 

<구현해야 하는 것>

반복문을 돌면서 각 시행마다 톱니 번호, 회전 방향을 입력받아

양 옆의 톱니바퀴를 순차적으로 확인하면서 회전 가능한지 여부 확인해서 회전 가능하다면 리스트에 넣고 

회전 가능하지 않으면 반복문 break해서 더이상 옆의 톱니들 확인하지 않도록 해주기 

톱니 회전 가능 여부를 살펴본 뒤 모든 톱니 한번에 회전시키기 

 

※ 주의 사항: 톱니 하나씩 확인하면서 회전 가능 여부 따지고 나서 그 순간 회전을 바로 시키지 않도록 주의 한다//

                     톱니의 정보가 바뀌면 회전 가능 여부가 바뀐 톱니의 정보에 대해서 따지게 되므로 톱니의 회전의 반영은 

                     회전 가능 여부를 마친 뒤 동시에 회전시켜야 한다.

 

(1) 회전시키려는 톱니의 오른쪽에 있는 톱니들 회전 가능 여부 확인 ->  have_to_rotate 에 (회전방향, 톱니 번호) 추가 

(2) 회전시키려는 톱니의 왼쪽에 있는 톱니들 회전 가능 여부 확인 -> have_to_rotate 에 (회전방향, 톱니 번호) 추가 

(3) 해당 톱니를 포함해서 회전 가능한 톱니들 회전, 위치 변화 동시 반영 -> turn() 함수 실행 

(4) 모든 반복문이 종료된 후 점수 계산 


# 톱니는 동시에 돌아가니까 톱니의 위치가 변한 것은 가장 마지막에 반영해야 함 !! 중요 

import sys 
#input = sys.stdin.readline -> 한줄씩 통채로 읽어오므로 map(int, input()) 이런식으로는 함께 사용하지 못함 

steer = [[] for _ in range(4)] # N:0, S:1
for i in range(4):
    steer[i] = list(map(int, input())) #공백없는 입력 띄어서 입력받기

k = int(input())

def turn(rot, origin_steer):
    new_steer = [0 for _ in range(8)]
    if rot == 1:
        for j in range(8):
            new_steer[j] = origin_steer[j-1]
    else:
        for j in range(-1, 7):
            new_steer[j] = origin_steer[j+1]

    return new_steer

## main ##
for _ in range(k):
    st, rot = map(int, input().split()) # rot -> 1:시계, -1:반시계
    st = st-1 

    have_to_rotate=[]
    have_to_rotate.append((rot, st))
    
    #움직이려는 톱니의 양 옆으로 하나씩 돌릴지 말지 결정하고 안돌리면 for문 break 
    #(1)오른쪽 돌아가는지 
    rot_r = rot
    rot_l = rot 
    for p in range(st, 3):
        rot_r = rot_r*(-1)
        ax1 = steer[p][2]
        ax2 = steer[p+1][6]
        #print('steer[p]:{},ax1:{}, ax2:{}'.format(p, ax1, ax2))
        if ax1 != ax2:
            have_to_rotate.append((rot_r, p+1))
        else:
            break 

    #(2)왼쪽 돌아가는지
    for p in range(st, 0, -1):
        rot_l = rot_l*(-1)
        ax1 = steer[p][6]
        ax2 = steer[p-1][2]
        if ax1 != ax2:
            have_to_rotate.append((rot_l, p-1))
        else:
            break

    #(3)후보 톱니 돌리기, 위치 변화 동시 반영 
    for r, idx in have_to_rotate:
        steer[idx] = turn(r, steer[idx])
 
#(4) 점수 계산 
score = 0 
for i in range(4):
    if steer[i][0] == 1:
        score += 2**(i)

print(score)
반응형

'알고리즘 > boj' 카테고리의 다른 글

1655: 가운데를 말해요 (Python)  (0) 2022.07.28
15685: 드래곤 커브 (Python)  (0) 2022.07.28
12865: 평범한 배낭 (Python)  (0) 2022.07.27
16639: 괄호 추가하기 3  (0) 2022.07.16
18500 미네랄2  (0) 2022.07.16