하도 오랜만에 써서 뭐 쓰려고 했는지 까먹을 뻔했다. (까먹었다가 겨우 생각해냈다.)
100개일 때만 4점이 나와서 5점으로 채우기 위해 최적화를 했다.
처음 생각했던 것은, b_to_a()
에 들어가기 전까지 a_to_b()
만 반복할 때는 rrr
과 rra
가 의미없이 돌아간다는 것이다.
그걸 해줘도 스택 a
는 하기 전과 똑같기 때문에, rrb
만 해주면 된다.
이것만 처리해도 확 줄일 수 있을 거라고 생각했다.
b_to_a()
에 한 번도 안 들어갔을 때만 rrr
과 rra
를 안 하면 되는 거니까, b_to_a()
에 한 번이라도 들어갔는지를 확인하는 변수를 만들었다.
int
형 cnt
변수를 선언하고 0으로 초기화했다.
그리고 처음 push_swap()
에서 a_to_b()
를 호출할 때 &cnt
로 넣어줬다.
b_to_a()
에서도 주소값을 보내서 다른 함수에서 바뀐 값을 그대로 가지고 다니게 했다.
a_to_b()
에서는 cnt
의 값을 변경하지 않고, b_to_a()
에 들어가면 기장 먼저 cnt
값을 +1 해준다.
이렇게 하면 한 번이라도 b_to_a()
에 들어갔으면 cnt
는 0이 아닌 값을 가지게 될 것이다.
이제 a_to_b()
에서 rrr
과 rra
를 할 때, cnt
값이 0보다 큰지를 확인해서 0보다 클 때만 rrr
과 rra
를 해준다. 0보다 크지 않을 때는 rrb
만 해준다.
사실 이걸 먼저 했다.
hyunlee님이 알려주셔서 했다. Thanks~!
처음부터 인자가 5개만 들어왔을 때 말고, 함수를 막 호출하다가 정렬해야 하는 노드가 5개일 때를 처리했다.
스택 a
에서는 5개 중에 중간값을 기준으로 중간값보다 작은 값들은 pb
했다.
그러면 이제 3개가 남는데, 이건 이전에 노드 3개를 정렬하는 함수를 그대로 사용했다.
스택 b
로 보낸 노드 2개도 정렬해서 pa
해줬다.
스택 b
에서는 스택 a
와 반대로 정렬해야 하니까 5개 중에 중간값을 기준으로 중간값보다 크거나 같은 값들을 pa
했다.
그러면 이제 스택 a
에 보낸 값 3개를 정렬한다.
그리고 스택 b
에 남아있는 노드 2개도 정렬해서 pa
해줬다.
방법 1만 해도 확~! 줄긴 하는데, 이것까지 해줘야 100개를 정렬할 때 안정적으로 660개 내외로 나왔던 것 같다.
7일 만에 쓰다니 미쳤나
이제 체커만 만들면 된다.
Day 10 안으로 끝내는 게 큰 목표고 안 되면 Day 15 안에라도 끝내고 싶었는데 가능할 것 같다.
사실 Day 10이라고 진짜 공부한 날이 10일밖에 안 되는 건 아니구,,
내일 끝낸다고 쳤을 때 따지고 보면 2주 정도 한 것 같다.
어쨌든 나쁘지 않음~