[push_swap] Day 03. Push & Pop 작성하기

jkeum·2021년 5월 22일
3

push-swap

목록 보기
3/10
post-thumbnail

Push & Pop

생각한 방법

ji-kim님의 조언에 따라 push와 pop 함수부터 만들기로 했다.

push와 pop 함수를 따로 작성하려고 했다. push를 할 때 새로운 노드를 만들어서 스택에 추가해주고 그걸 top으로 지정하면 되겠구나 싶었다. 근데 이렇게 하면 push할 노드의 정보가 필요하니까, pop을 먼저 하면 안 되고 나중에 해야겠구나 싶었다. 그래서 push할 노드를 인자로 넣어줘서 push를 해주고, 그 다음에 그 노드를 pop하면 되겠다고 생각했다.

그런데..! 뭔가 좀 복잡한 것 같고 자꾸 헷갈리기도 해서 다시 잘 생각해봤다. 원래 있던 노드를 그대로 이용하면 되지 않을까? 노드를 삭제하고 새로 생성하고 이러지 않고 그냥 연결만 바꿔주는 것이다. 새로 할당하면 free()를 해야 하는데 그거 생각하기 귀찮으니까 이게 낫겠다 싶어서 이렇게 바꿨다. 그래서 하나의 함수에 다 작성했다.

코드 구조

인자로는 스택 a와 스택 b를 받아왔다. fromto로 이름을 지어서 from에서 pop해서 to에 push하게 작성했다.
먼저, from이 비어있을 때는 아무것도 실행하지 않으면 되기 때문에 그냥 리턴했다.
이 다음에 from에 노드가 하나만 있었을 때와 여러 개가 있었을 때를 나눠서 작성했다. from에 노드가 하나만 있으면 pop하고 나서 빈 노드가 되기 때문에 경우를 나누는 게 좋겠다고 생각했다. 각 경우에서는 또 다시 to가 비어있을 때와 그렇지 않을 때를 나눠서 작성했다.
from에 노드가 하나만 있을 때를 먼저 보겠다. 우선 to가 비어있을 때는 from->topto->top이 되고, 그 to->top이 곧 to->bottom이 된다. to에 노드가 하나라도 있었다면, to->top->prevfrom->top을 연결해주고, 그 form->top->nextto->top을 연결해준다. 그리고 to->top->prev가 이제 to->top이 된다.

그림을 넣고 싶은데 만들기 귀찮다. 나중에 시간되면.. 안 귀찮을 때 만들어보겠다.


마무리

push하고 pop하는 함수가 잘 작동하긴 하는데 왠지 코드에 자신이 없다.
뭔가 조건문이 많아지면 야매로 한 것 같은 느낌이 든다.
일단은 다 만들었으니까 이제 최대한 빨리 기능들 구현해야겠다.

profile
It's me, jkeum!

0개의 댓글