목록전체 글 (149)
Taking baby-developer steps
이제 push_swap과제에서 남은 부분은 1. 최적화 2.정렬되었는지 확인-> 되어있으면 아무것도 출력 안하고 끝내기 3.리팩토링 이다. 정렬을 할 수 있는 프로그램이 되긴 했지만, 이번 과제의 중점은 "명령을 최소한으로 내려서" 정렬 하는 것에 있다. 따라서 정렬을 다 했다고 끝이 아니라, 과제에서 요구하는 수준 까지 최적화를 해야 한다. 일단 앞서 push_swap과제를 완료하신 동료 카뎃분들의 이야기를 들어보니, 다음과 같은 수준을 만족해야한다고 한다. 현재 50개의 input 값을 정렬한 내 알고리즘이 내린 명령어 수는 다음과 같다. 50개 인풋에 851개의 명령어를 썼다면, 100개의 input에서는 더한 비효율을 보일것으로 예상 된다..! 50개의 input을 더 추가해, 알고리즘을 돌려보니..
정렬 알고리즘을 검토할 차례였지만 번아웃이 와서 한동안 과제에 손을 대지 않았다. 대신 협업도구 jira툴 다루는 법, 산업현장에서 원하는 개발자 커리어 관리 등의 현직 개발자 분들이 해주시는 특강을 들으며 다시 열심히 해야지 하는 마음만 다지며 그동안 의욕엔 불탔지만 제대로 쉬지 않았던 지난날을 돌아보았다. 하루에 과제하는 시간을 조금 제한하고, 대신 그 시간에 내게 필요한, 좀더 재밌게 할 수 있는 공부들을 해나갈 필요성을 깨달았다. 아침 일찍 클러스터에 나와 출퇴근 하듯이 하루 일과를 보내보려 한다. 평소 아침에 하던 운동도 저녁에 하는 걸로...! 지난 포스팅에서, 정렬이 제대로 이루어 지지 않고 있다는 것을 알게 되었고, 해당 부분을 디버깅 하기 시작했다. 먼저, 아직 정렬되지 않은 부분에 원래..
지난 포스팅에서 최종 정렬 결과 출력을 통해, 설계한 알고리즘이 의도한 정렬에 맞지 않는 다는 것을 확인했다. 더불어, 명령어 출력 최소화를 위해서, 불필요한 명령어를 줄이는 작업도 함께 진행 해보려고 한다. 현재 알고리즘에서는 middle 값이 t_node형 포인터인 unsorted가 가리키는 노드의 index 값인 경우에도, 이미 정렬 된 부분을 잠시 bstack에 넘기기 때문에, pb, pa 라는 2번의 명령어 사용이 발생하고, 이는 줄일 수 있는 비용이다. 이를 위해, 사용한 index i가 0이 아닌 경우 k번(sorted 된 원소의 갯수 만큼) pstack(pb)을 시행한다. 다시 pa가 될때도 동일하게 처리 했는데, 이때 이전에 null 노드가 do_* 관련 함수에 들어올 일 이 없게끔 설계..
지난 포스팅에서 pop_front 함수에서 lldb 디버거로 문제가 있음을 확인 했다. 28번째 줄에서 stack이 비어있을 경우에 stack이 비어있는데 head에 접근하려고 해서 생기는 sigfault라고 판단하고, stach에 head가 존재할 경우에만 작동하게 설정했다. 그 후 다시 컴파일 및 디버깅을 해보니, 이번엔 push_front 함수에서 문제가 발생함을 확인했다. new_top에 NULL이 들어올 일이 없게끔 설계 했다고 생각했기 때문에 NULL 노드가 들어올 경우를 처리하지 않았는데, 그게 문제가 된것 같다. 17, 18줄을 추가했다. 그 후 다시 컴파일 하니 이번엔 push_back 함수이다. push_front와 동일하게 32,33 줄을 추가했다. 이렇게 push/pop 관련 3개의..
지난번 발생한 sigfault를 해결 하기 위해 lldb 디버거를 사용해봤다. 예상외로 pop_front함수에서 문제가 있었던 것으로 확인 되었다.
이제 스택 a는 index 기준으로 오름차순, b스택은 내림 차순으로 정렬할 차례이다. 사실 오름차순이던 내림 차순이던, middle 값에 가까운 값부터 찾아서 top으로 가져오면 되긴 한다. 이를 어떻게 코드화 시킬지가 좀 문제 이긴한데, 구상 중이다. 정렬이 완료되지 않은 부분의 index는 k, k로 부터 middle값이 떨어져 있는 거리를 i index로 표기해서, 해당 값이 tail에 가까운 경우엔 rra로, head에 더 가까운 경우엔 ra로 k위치로 옮긴다. sigfault가 발생했다. n_times_(order) function의 첫번째 호출에서 시그먼테이션 폴트가 발생하는 것으로 보인다. 1.n_times 계열 function의 작동 구현에서 문제가 있다. 2. 넘겨주는 index int..
스택에 입력값 저장시, contents는 정상적으로 저장이 되나, arr4i내에서의 index 값이 저장되지 않은 문제점이 있었다. 문제는 line 36줄에 있는 while 문이었다. 현재 arr4 배열의 끝에 문자열 처럼 '\0' 문자를 넣고 배열을 사용 했는데, 문제는 arr4i가 int형 배열이라, 위처럼 input으로 0이 들어오게 되면, 널 값의 ASCII 코드와 동일한 값으로 인식되어, 첫번째로 들어온 input 값인 '3'을 찾기전 i = 1 일때의 arr4i[1]의 값이 0이되므로 while문이 돌지 않게되어 new node에 index를 저장하지 못하게 된것이다. 문자열 처리를 많이 하다보니 int형 배열에 널 터미네이트를 적용해서 생긴 이슈였다. input amount 값(들어온 inp..
어제 기록한 대로, 정렬부를 구현하기 전, int main문을 한번 작은 함수들로 나누고 가야할것 같다. norm 규정상 하나의 함수가 25 line을 넘을 수 없기 때문이기도 하지만, main 문이 너무 길어지면 가독성이 너무 떨어져서 편의상으로도 필요하다. 리팩토링 과정이기 때문에, 수정 전과 후에 결과물에 변화가 없는지 중간중간 테스트를 병행하면서 진행했다. refactoring 도중, 스택에 추가할 새 노드를 만드는 make_a_node 함수에서 변경해야할 사항이 생겼다. 이전 포스팅에서도 한번 언급 한적이 있었는데, make_a_node 함수 내에 arr4i배열 내에 존재하는 content의 값을 찾아, 해당 값의 index를 노드의 index 값에 저장하는 부분이 있는데, 현재 argv를 한번..
어제 pop_front함수로 a_stack에서 top에 존재하는 노드를 추출해서 이를 push_front로 b_stack의 top에 해당 노드를 넣는 메인문을 테스트해본 결과, a스택을 출력하자 추출된 top node만 나오고, b스택에는 추가한 노드가 top에 저장되지 않은 결과를 얻었다. 결과를 얻자마자 t_stack 구조체에 편의상 저장해둔 노드의 갯수(counts)와 top_index(스택이 비었을땐 -1, 비어있지 않을땐 node.index)를 출력해본 결과,해당 값들은 의도한 대로 동작했을 경우에 나올 정상값을 반환했다. 다시 한번 push, pop 함수들을 돌아봤지만 문제점을 발견하지 못했다. 그래서 main 문을 보니, stack들에 초기 값을 넣어주는 초기화 과정에서 스택의 출력을 위해 ..
스택 관련 기본 연산(push, pop=> 각각 front, back 모두)을 구현 하면서, 원래는 unsigined int 형 index값과 int형 contents 값을 파라미터로 받아서 그때마다 new node를 만들고 free 해가면서 사용하려고 했는데, 오히려 번거로워질거 같아서, pop 연산에서 node를 반환하고 그 노드를 push 연산에서 그대로 받아서 사용하기로 했다. => 이번에 만들 프로그램에서는 한번 입력 값이 다 들어오고 나서는 따로 추가될 노드(데이터)가 없기 때문. 따라서 각각의 연산관련 함수의 프로토 타입이 위와 같이 변경되었다.(new_top, new_back의 자료형은 오타이다. 현재는 t_node형으로 변경 됨) push_front 작동 구상 push_back 작동 구상..