맛동산

(파이썬)백준 알고리즘 1021번 회전하는 큐 본문

파이썬/알고리즘

(파이썬)백준 알고리즘 1021번 회전하는 큐

오지고지리고알파고포켓몬고 2016. 12. 19. 21:27

백준 알고리즘 저지 1021번 문제 (https://www.acmicpc.net/problem/1021)



처음에는 모듈로 연산을 이용해 환형 큐 형식으로 구현하려고 했지만 뜻대로 잘 되지 않았음


좌측, 우측 회전을 비교한 최단거리를 rPointer라는 변수에 담에서 그곳을 기준으로 다시 리스트를 재조합하는 방식으로 구현했음



 
D = []  #
mList = []
pointer = 0
count = 0

N, M = map(int, input().split())
for i in range(1, N + 1):
    D.append(i)
for j in map(int, input().split()):
    mList.append(j)
#pointer = mList[0] - 1

a=[]
def dial(num, p):#5 0
    right = 0
    left = 0
    #print('point')
    #print(p)
    while True:
        if D[p] == num:
            left = len(D) - right
            #print('left=%d right=%d'%(left,right))
            #del (D[p % len(D)])
            break
        else:
            right += 1
            p += 1
            #print(p)

    if right < left:
        if len(D) == 0: return 0, right
        #if p>len(D)+1:return p-(len(D)+1), right
        return p, right
    else:
        if len(D) == 0: return 0, left
        #if p > len(D) + 1: return p - (len(D) + 1), left
        return p , left

for i in mList:
    pointer=0
    rPointer, rCount = dial(i, pointer)
    temp=D[rPointer+1:]
    temp+=D[:rPointer]
    D=temp
    #print('리턴값은 %d %d'%(rPointer,rCount))
    #pointer = rPointer
    count += rCount
print(count)


(이게 2달전 쯤 했던건데 지금보니 무의미한 변수가 있기도 함)


나도 길을 헤메일 누군가를 위해 코드를 공유하지만 이 글을 보고 있다면 문제 해결방법을 충분히 고민한 뒤에 찾아보는 것이길 바람

(추가적으로 알고리즘은 현답은 있지만 정답이 없는 문제라고 생각함.. 더 나은 풀이법이 있다면 다같이 공유할 수 있었으면 좋겠음!)

Comments