맛동산

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

파이썬/알고리즘

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

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

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



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


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



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
·¬
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)¬
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX


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


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

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

Comments