보물창고 블로그

SW Expert Academy 4130. [모의 SW 역량테스트] 특이한 자석 본문

알고리즘 풀이/SW Expert Academy

SW Expert Academy 4130. [모의 SW 역량테스트] 특이한 자석

홋 메 2020. 1. 23. 14:26
728x90

문제 링크: https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWIeV9sKkcoDFAVH

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

이 문제를 해결하기 위해 파이썬 내장 모듈인 collections에서 deque를 사용하였다. 자석의 회전을 구현할 때 각 자석마다 인덱스를 저장하는 것을 생각하였다가 계산하는 것이 귀찮아서 반시계 방향일 때는 원소의 0번째 원소를 마지막 원소에 삽입시키고, 시계방 향일 경우 원소의 마지막 원소를 0번째 인덱스에 넣었다. 일반 list로 구현할 시 pop의 시간 복잡도가 O(n)이라 deque를 사용하였다. 이 리뷰를 쓰는 중에 발견한 것인데 deque에 rotate라는 메서드가 회전하는 것을 구현한 것이라는 것을 뒤늦게 알게 되었다. rotate메서드를 쓴다면 코드가 더욱 간결해질 것이다. 나의 풀이는 아래와 같다. 

from collections import deque
t=int(input())
rotate=[]
for test in range(1,t+1):
    answer=0
    k=int(input())
    magnet=deque()
    for _ in range(4):
        magnet.append(deque(map(int, input().split())))
    for _ in range(k):
        n,d=input().split()
        n=int(n)
        if d=='-1':
            d=-1
        else:
            d=1
        rotate.append([n,d])
        flag = [0 for _ in range(4)]
        while(rotate):
            n,d=rotate.pop()
            if n==1:
                flag[0]=1
                if magnet[0][2]!=magnet[1][6] and flag[1]==0:
                    rotate.append([2,-d])
                if d==1:
                    magnet[0].appendleft(magnet[0].pop())
                elif d==-1:
                    magnet[0].append(magnet[0].popleft())
            elif n==2:
                flag[1]=1
                if magnet[0][2]!=magnet[1][6] and flag[0]==0:
                    rotate.append([1,-d])
                if magnet[1][2]!=magnet[2][6] and flag[2]==0:
                    rotate.append([3,-d])
                if d==1:
                    magnet[1].appendleft(magnet[1].pop())
                elif d==-1:
                    magnet[1].append(magnet[1].popleft())
            elif n==3:
                flag[2]=1
                if magnet[1][2] != magnet[2][6] and flag[1] == 0:
                    rotate.append([2,-d])
                if magnet[2][2] != magnet[3][6] and flag[3] == 0:
                    rotate.append([4,-d])
                if d==1:
                    magnet[2].appendleft(magnet[2].pop())
                elif d==-1:
                    magnet[2].append(magnet[2].popleft())
            elif n==4:
                flag[3]=1
                if magnet[2][2] != magnet[3][6] and flag[2] == 0:
                    rotate.append([3,-d])
                if d==1:
                    magnet[3].appendleft(magnet[3].pop())
                elif d==-1:
                    magnet[3].append(magnet[3].popleft())
    for i in range(4):
        if magnet[i][0]==1:
            answer+=pow(2,i)
    print('#{} {}'.format(test,answer))
Comments