Push_Swap

Worldi·2022년 8월 10일
0

42seoul

목록 보기
14/15

메모리 누수 잡기

https://velog.io/@taelee/C-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%88%84%EC%88%98-%EA%B2%80%EC%82%AC%ED%95%98%EA%B8%B0

테스터기

https://github.com/minckim42/push_swap_tester
https://github.com/laisarena/push_swap_tester.git
https://github.com/lmalki-h/push_swap_tester

만약 ./push_swap "1 3 5" 이렇게 들어온다면, 1 3 5 가 하나의 문자열로 들어온다. 이걸 1 , 3 , 5 로 쪼개야 한다.
우리에겐 ft_split()이 있으니 그걸 사용하기로 했다.

많이 바꿔야 하나 싶어서 걱정했는데 많이 바꿀 필요는 없었다.
main()에 들어온 인자(문자열) 하나씩 확인하면서 그 인자를 또 ft_split()으로 나눈 이중배열을 만들었다.
예를 들어, ./push_swap "4 2" 42 이렇게 들어오면 첫 번째 문자열 argv[1](=4 2)를 확인한다.
이 문자열을 다시 ft_split(argv[1], ' ')로 잘라서 char *형의 arg에 담아준다.
이제 arg[0] = 4, arg[1] = 2가 되었다.
그럼 다시 반복문을 돌려서 arg의 0번째부터 끝까지 노드를 하나씩 만들고 값을 담아준다.

뭐랄까 이전에 main()에서 받아온 인자 argv를 가지고 반복문 돌려서 했던 작업을 ft_split()으로 만든 이중배열 arg로 돌리는 반복문 안에 넣어줬다. 그 정도 차이?
여기서 ft_split()으로 받아온 이중배열 잘 free() 해주기!

예외 생각

arg가 3개일 때

평가표에 3개일 때, 5개일 때 몇 개를 넘지 않아야 하는지가 나와 있다.
다들 3개랑 5개일 경우에는 따로 처리하라고 했다. 그래서 따로 코드를 작성했다.

스택에 arg가 3개만 들어왔을 경우에는 평가표에 따르면 최대 2번까지만 기능을 동작시켜서 정렬해야 한다.
이때는 경우의 수가 6개니까 그냥 조건을 다 따져서 처리하면 된다.

방법

arg 3개 중 min과 max를 찾는다.

min 값을 가진 노드가 어디에 위치하는지를 먼저 찾고, 다시 경우를 나눈다.
2-1. a->top->value가 min인 경우
2-2. a->top->next->value가 min인 경우
2-3. a->bottom->value가 min인 경우

위의 세 가지 경우에 대해 각각 max 값을 가진 노드는 어디에 위치하는지 찾는다.

각각의 경우에 맞게 적절하게 sa, ra, rra를 하면 끝~!

멤췌!
그런데 생각해보니까 정렬을 하던 중에 3개만 정렬해야 할 때 있잖아요?
그때는 막 bottom이랑 비교하면 안 되고, 처음에 rra나 rrb를 해버리면 안 되고 그런 문제가 있으니까 그건 또 따로 짜줘야 했다.
처음에 위에서 짠 코드를 이런 경우에서도 그대로 적용시켜서 이상하게 나왔었다. 으이구 인간아 ᕙ( ︡’︡益’︠)ง
그래서 그냥 그것도 경우 6개 다 따로 짰다.

arg가 5개일 때

스택에 arg가 5개만 들어왔을 경우에는 평가표에 따르면 최대 12번까지만 기능을 동작시켜서 정렬해야 한다.
이때는 경우의 수가 좀 더 많아지고 조건을 다 따지기엔 복잡하니까 방법을 좀 달리했다.

방법

arg 5개 중 mid를 찾는다.

스택 b에 노드가 2개 쌓일 때까지만 반복문을 돌린다. int형 변수 pb를 만들어서 pb를 몇 번 했는지 세고 그게 2가 되면 반복문을 빠져 나오게 했다.

만약 a->top->value가 mid보다 작으면 pb를 하고, mid보다 크거나 같으면 ra로 위로 회전시켜 맨 밑으로 보낸다.

여기까지 하면 스택 a에는 arg 5개 중 가장 큰 값 3개만 남고, 스택 b에는 가장 작은 값 2개가 들어가있을 것이다.

이제 스택 a는 위에서 arg가 3개만 들어왔을 때 사용한 함수를 호출해서 정렬해준다.

스택 b는 arg가 2개일 때 사용한 함수를 호출해서 정렬하고 pa를 한다.

profile
https://worldi.tistory.com/ 로 블로그 이전합니다.

0개의 댓글