akqjqcjs7   3년 전

문제는 해결했습니다. 하지만 시간이 오래걸려 찜찜합니다. 그래서 궁금한 점 몇가지를 여쭤보고자 합니다.

1. 제가 delete에 62번줄을 보시면 이동시킨 front가 NULL이 아니면 back을 NULL이라고했습니다. front가 NULL인데

back을 NULL이라고 하니 실행이 제대로 안됬습니다. front가 NULL이면 아무 것도 없는데 back을 설정해서 오류가 나는건가요?

2. 이 문제가 입력이 특이해서 고민해서 입력부분을 구현했습니다. 하지만 이것때문인지 시간이 오래 걸리는것 같습니다. 효율적인 방법이 있을까요?

3. 연결리스트 관한 문제를 풀면서 느끼는점이 제 코드가 좋은가? 라는 의문점입니다. 코드에서 굳이 필요 없는 부분이 있거나 줄일 부분이 있다면 피드백을 받고 싶습니다.


이해하는데 도움을 드리고자 주석을 달아놓았습니다. 저도 글을 올리고 코드를 수정하겠지만, 고수분들의 실질적인 팁을 얻고 싶습니다. 

seico75   3년 전

아무도 답을 안주시는 것 같아서...

1. front 가 NULL 이라는 것은 front 가 아무것도 아니라기 보다는 아무것도 아니라고 표시를 해 놓은 것입니다.

   주소를 NULL(==0) 으로 준 것인데, front->back 으로 접근을 하면 0 주소에 접근을 하기 때문에 런타임 에러가 납니다.  0주소는 사용할 수 없는 주소라서요.

   아무것도 아니라는 것을 일반적으로 NULL를 쓰지만 다른 값을 쓸 수도 있습니다. 예를 들어서 Nothing 이라는 node 를 하나 만들고 그 주소를 아무것도 아니라고 쓸 수 있습니다.

   이러한 방법도 꽤 유용한데, 큐가 비었있을때 front, rear 가 NULL 아니라 Nothing 이라는 실제 노드를 가리키기 때문에 큐가 비었을 때의 예외처리가 쉬워집니다.

2. 입력이 꽤 특이한데 위와 같이 하는 것이 느리게 하는 원인은 아닌 것 같습니다. 

    작성하신 코드가 그렇게 느린 편은 아니지만 더 빠르게 하려면 링크드 리스트 말고 배열을 쓰는 것이 어떨까합니다.

    메모리 할당도 꽤 시간을 잡아먹습니다.

3.1 cursor 꼭 필요하지 않은 것 같습니다. add 할 때만 쓰는데, rear 를 써서 할 수 있을 것 같습니다. 

3.2 delete 할때 메모리를 해제하는 부분이 빠져있습니다. front 를 끊어낼때 front 를 free 하고, rear 를 끊어낼때도 rear 를 free 해야 leak 이 안납니다.

     그리고 front 를 끊어내고 나서 NULL 이되면 rear 도 NULL 이 되어야지 진정한 empty 상태가 됩니다.

3.3 3.1과도 연결이 된 문제인데..

     함수를 사용하는 목적은 중복된 코드를 분리하는 것도 있지만 그 함수의 상세 구현을 신경쓰지 않도록 하여서 관심을 레벨을 조정하고 (표현이 맞는지.. ㅠㅠ)

    실수를 줄이는데 있다고 생각됩니다.  지금 구현은 전체적으로는 빈틈이 없어 보이지만 수정하다보면 실수가 나올 수 있을 것 같습니다.

    a. add 가 항상 n-1 까지 가야지 rear 변수가 설정됩니다.  이 함수를 부르고 나면 언제라도 정상사용이 가능한 상태여야 믿고(?) 쓰는데, 그렇지 않다면  

        이 함수는 n-1까지 다 불렀는지 신경을 써야 합니다.  그래서 cursor 대신에 항상 rear 를 설정해서 쓰면 add를 몇번을 부르더라고 delete 를 부를 수 있는 상태가 됩니다.

    b. delete 내에는 큐가 비었는지 확인을 하지 않고 main 함수에서 하는데 큐가 비었을 때 동작을 막는 (에러처리를 하는 것은) delete 함수의 역할로 보입니다.

        큐가 더 뺄 것이 없으면 bool 리턴값 등으로 오류를 내어주는 것이 좋을 것 같습니다.


객체지향이 아니어도 함수는 SOLID 원칙의 단일 책임 원칙를 따르는 것이 맞을 것 같다는 생각입니다.

akqjqcjs7   3년 전

자세하게 설명해주셔서 코드의 문제점을 더 쉽게 이해할 수 있었습니다.. 정말 감사합니다. 말씀해주신데로 코드를 수정해보겠습니다.

댓글을 작성하려면 로그인해야 합니다.