파이썬/알고리즘
(파이썬)백준 알고리즘 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달전 쯤 했던건데 지금보니 무의미한 변수가 있기도 함)
나도 길을 헤메일 누군가를 위해 코드를 공유하지만 이 글을 보고 있다면 문제 해결방법을 충분히 고민한 뒤에 찾아보는 것이길 바람
(추가적으로 알고리즘은 현답은 있지만 정답이 없는 문제라고 생각함.. 더 나은 풀이법이 있다면 다같이 공유할 수 있었으면 좋겠음!)