배열로 push_swap 해보자! (번외)

배열로 push_swap 해보자! (번외)

“push_swap에 대하여”

메모

  • push_swap을 진행하면서 내가 남겨놓은 메모가 있다. rotate와 reverse rotate에서 보여준 적이 있는데, 여기에 내가 남겼던 나머지 메모들을 풀어놓는다.

1. push_front


  • stack a = {1, 2, 3, 4, 5, 6}에 차례로 7, 8을 push_front하는 과정이다.

2. push_back


  • stack a = {7, 1, 2, 3, 4, 5, 6}에 차례로 8, 9를 push_back하는 과정이다. 9을 push할 때, size(8)가 capacity(8)와 동일하여 resize한다.

3. pop_front


  • stack a = {7, 1, 2, 3, 4, 5, 6}에 pop_front를 두 번 실행하는 과정이다. stack a는 {2, 3, 4, 5, 6}이 된다.

4. pop_back


  • stack a = {2, 3, 4, 5, 6}에 pop_back을 두 번 실행하는 과정이다. stack a는 {2, 3, 4}가 된다.

5. rotate


  • 지난 글에서 rotate를 설명할 때 넣지 않은 다른 메모다. stack a = {1, 2, 3, 4, 5, 6}을 rotate하는 과정이다. head를 한칸 옮겨 pop_front하고, 그 pop한 값을 그대로 push_back해서 결과적으로 stack a를 {2, 3, 4, 5, 6, 1}로 만들어놓는다.

6. sort 3

int	sort_3(t_deque *deq)
{
	int	a[3];

	deque_to_arr(deq, a);
	if (a[0] > a[1])
	{
		if (a[0] > a[2])
		{
			do_ra(deq);
			if (a[1] > a[2])
				do_sa(deq);
		}
		else
			do_sa(deq);
	}
	else
	{
		if (a[1] > a[2])
		{
			do_rra(deq);
			if (a[2] > a[0])
				do_sa(deq);
		}
	}
	return (0);
}
  • 이건 원소 3개를 하드코딩하는 건데 deque_to_arr(deq, a);로 스택을 배열로 깔끔하게 발라놓고, a[idx]를 하나하나 확인하면서 명령어를 실행한다.

  • deq의 배열과 a의 배열은 원본 <-> 복사본 관계로 sort 3함수에서는 a 배열의 순서만 확인하면서 원본 deq 배열의 순서를 바꿔주기 때문에 a 배열의 순서에 변동을 주지 않으면서 deq를 정렬할 수 있다.