파이썬으로 부시자! Python with Coreenee

BAEKJOON 14891

문제

스크린샷 2020-05-05 오전 11 45 51 스크린샷 2020-05-05 오전 11 46 01 스크린샷 2020-05-05 오전 11 46 08

입력

스크린샷 2020-05-05 오전 11 46 17


나의 처음 코드

이 문제를 봤을 때, 왜인지 이진수 shift로 푸는 문제같아서 그 방법으로 풀어봤다. 내가 아직 방법이 부족한거인지는 몰라도, 왼쪽으로 톱니바퀴가 돌 때는 왼쪽으로 한칸씩 shift하고 1을 더해주면 됐었다. 그런데 오른쪽으로 쉬프트할 때는, 0이 추가될 때는 0110이 110으로 인식되어서 문제를 일으켰다. 그래서 에라잇 그냥 원래 풀던방법으로 풀자 해서 평범하게 풀었다. 우선 여기 문제에서는 지정한 톱니바퀴가 돌 때 양 옆에 있는 톱니바퀴와 비교를 해서 극이 2번 톱니와 6번 톱니가 극이 같으면 옆에 있는 톱니바퀴는 돌지 않고, 극이 다르면 톱니가 돌기 시작한다. 예를 들어 2번 톱니를 지정해서 시계방향으로 돌리는데, 인접한 1번 톱니와 극이 같으면 1번 톱니바퀴는 회전을 하지 않는다. 만약 인접한 3번 톱니바퀴와 극이 다르면, 3번 톱니바퀴는 2번 톱니바퀴와 반대 방향으로 회전을 하게 되는 것이다. 내가 푼 방식은 특정 톱니바퀴를 돌리라는 오더가 있으면, 특정 톱니바퀴에서 양방향으로 극이 같은지/다른지 인덱스를 증가하면서 확인하는 것이다. 그리고 revolve라는 함수를 통해서 오른쪽 shift, 왼쪽 shift를 구현하였다. 코드는 다음과 같다.

roll_status = []
rev_list = []
#이진수 형태로 변환해서 리스트에 삽입
for i in range(4):
    roll_status.append(input())
    
numOfrev = int(input())
for i in range(numOfrev):
    rev_list.append(tuple(map(int, input().split())))
#immutable로 만들려고 tuple로 오랜만에 만들었는데, tuple에는 append가 없다.

def revolve(status, way):
    #way = 1이면 시계, -1이면 반시계
    if way == 1:
        if status[-1] == '1':
            status = '1' + status[0:-1]
        else:
            status = '0' + status[0:-1]
    #멍청하게 else로 해서 0까지 -1역핧을 해버림;;
    elif way == -1:
        if status[0] == '1':
            status = status[1:] + '1'
        else:
            status = status[1:] + '0'
    return status
        
        
for info in rev_list:
    nth, way = info
    way_list = [0] * 4
    way_list[nth-1] = way
    #왼쪽으로    6  2
    for i in range(nth-1, 0, -1):
        #같은 극일 때
        if roll_status[i][6] == roll_status[i-1][2]:
            break
        else:
            way_list[i-1] = way_list[i] * -1    
    #오른쪽으로
    for i in range(nth-1, 3):
        #같은 극일 때
        if roll_status[i][2] == roll_status[i+1][6]:
            break
        else:
            way_list[i+1] = way_list[i] * -1
    
    for i in range(4):
        roll_status[i] = revolve(roll_status[i], way_list[i])
    
    
score = 0
for i in range(4):
    if roll_status[i][0] == '1':
        score += 2**i
    
print(score)

바보같은 실수만 줄인다면, 더 성장할 수 있을 것이다…. 제발….꼼꼼히…