inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘

연결 리스트 구현 연습

연결리스트 Remove 관련 질문입니다.

325

도다온

작성한 질문수 1

0

public void Remove(Room<T> room) {

if (room == Head) {

Head = Head.Next;

Head.Prev = null;

}

else if (room == Tail) {

Tail = Tail.Prev;

Tail.Next = null;

}

else {

room.Prev.Next = room.Next;

room.Next.Prev = room.Prev;

}

Count--;

}

 

제가 구현한 Remove는 이렇습니다.

강의에서 room.Prev 와 room.Next 의 null 유무를 체크하던데, 여기서 이해가 안 되어 질문드립니다.

 

1, 2, 3, 4, 5의 경우라고 가정해보면

1은 head, 5는 tail, 이를 삭제하려고 할 경우 앞의 두 조건문에서 걸립니다.

나머지의 2, 3, 4 를 가정해보면 이 노드들은 필히 Next 와 Prev가 존재합니다. AddLast를 보더라도 Tail의 next와 newRoom의 Prev를 서로 연결하는 부분이 존재하니 말이죠. 그러니 이를 굳이 조건절에서 검증해야 할 필요가 있나?가 궁금합니다.

 

또 head, tail 조건에서도 Head.Prev = null, Tail.Next = null 을 하지 않으면 remove의 조건을 정확히 충족하지 못한다고 생각합니다. 어찌됐든 접근할 수 없도록 만드는 게 이론적으로 삭제와도 같으니깐요. null 처리를 안 할 경우 만약 Head.Prev를 하게 되면 삭제했던 노드를 다시 호출할 수 있게 된다고 봅니다.

C#

답변 3

0

Rookiss

말씀하신 null 처리는 room.Prev.Next = room.Next; 로 간접적으로 처리 됩니다.
왜냐하면 room.Next가 null이면 (즉 마지막 방이라면) 알아서 null로 밀어주기 때문이죠.

코드는 다양한 방법으로 구현할 수 있고 정답이 있는 개념이 아닙니다.
따라서 말씀하신 것처럼 각 상황으로 if else로 구분해도 당연히 됩니다.

0

도다온

이해 했습니다. 자세한 답변 감사드립니다!

0

도다온

추가적으로 값이 1개일 경우

처음 조건을 else if로 변환한 후

if (room == Head && room == Tail) {

Head = null;

Tail = null;

}

이와 같은 코드도 추가하였습니다. 이렇게 해도 질문에는 큰 변함이 없습니다.

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

도다온님, 연결 리스트의 Remove 메서드 구현과 관련하여 Prev와 Next가 null인 경우에 대한 검증의 필요성에 대해 질문하셨습니다.

해당 질문과 유사한 내용을 담고 있는 기존의 질문&답변을 찾았습니다. 강의 중 해당 부분에서 조건 검사가 왜 필요한지에 대한 설명이 포함되어 있으니 참고하시면 좋을 것 같습니다.

  • 연결리스트 구현에서는 room.Prev와 room.Next가 null일 수 있는 여러 경우에 대해 검증하는 이유를 설명하고, Head와 Tail의 변경과 관련된 처리 방법에 대해서도 논의하고 있습니다.

질문자님의 경우에도 Head.Next와 Tail.Prev를 null로 설정하신 것처럼, 리스트의 양 끝 노드를 삭제할 때 특정 필드를 null로 설정해야 하는 이유에 대해 질문하고 있습니다. 강의에서는 연결리스트가 상황에 따라 일관되게 동작하도록 만드는 것이 중요하다고 강조하고 있습니다. null 체크는 양 끝 노드에 한해서뿐만 아니라 리스트의 일관성을 위해 필요한 조치입니다.

위의 링크를 통해 보다 자세한 설명을 확인해보시고, 제시된 예시 코드와 비교하여 다양한 사례에서 Remove 메서드가 어떻게 동작해야 하는지 이해하는데 도움이 될 것입니다.

모호한 부분이 있거나 추가적으로 궁금한 점이 있으시다면 해당 강의의 Q&A 섹션을 통해 지식공유자께 질문을 하여 보다 자세하고 명확한 답변을 얻으실 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

0

도다온

질문자님의 경우에도 Head.Next와 Tail.Prev를 null로 설정하신 것처럼, 리스트의 양 끝 노드를 삭제할 때 특정 필드를 null로 설정해야 하는 이유에 대해 질문하고 있습니다.

 

무슨 말인지 모르겠네요 이건. 질문하고 있는 게 아니라 당연하게 특정 필드를 null로 해야하지 않나, 강의 코드에는 이게 없다 왜 그렇나를 질문한 겁니다.

게임개발에서 주로 어느부분에 알고리즘들이 쓰이는지 궁금합니다

0

297

2

글꼴 바꿔도 자간이 좁아 찌그러져보이시는 분들

1

170

1

NullReferenceException 예외) 같은 실수하시는분 계실까봐 남겨요

0

138

1

parent를 Pos타입으로 만든 이유

0

122

1

콘솔창에 격자가 안나옴 미로 생성 X

0

202

1

격자 생성 안됨 무한루프

0

174

1

BFS 질문

0

205

2

격자 무한 출력

0

244

2

A* 의 PriorityQueue 관련 질문입니다

0

216

2

vscode에서 원그리기

0

235

1

환결설정 강의 원 그리기

0

177

1

15-17분

0

142

1

3:16초에 근데 이렇게 해가지고 부분에 "{}"를 만들어서 자식 node들을 생성하던데 왜 중괄호로 감싸게 만드는 건가요?

0

195

2

동적 배열 관련 질문입니다!

0

262

1

Big-o 표기법에서 시간 복잡도

0

216

1

7:40에서 언급하신 색상이 날아가는 문제 이해를 못하겠습니다

0

196

1

트리구현연습 강의 질문있어요

0

192

1

창은 뜨는데 맵이 나타나지 않아요.

0

243

1

Ctrl F5 하면 나오는 창은 어디서 설정할까요??

0

342

1

void CalcPathFromParent(Pos[,] parent)에 대해서

0

260

2

NullReferenceException예외가 발생했을때 어떻게 해야하나요?

0

257

1

[해결] 환경설정 강의에서 원이 이상하게 그려지는 문제

3

375

2

오른손 법칙에서 플레이어 점이 안 움직입니다

0

293

2

맵 만들기 오류

0

220

1