LinkedList 과제 Fast, slow 포인터
1. 현재 학습 진도
2챕터 과제, 끝에서 K번째 노드값 구하는 문제
LinkedList
2. 어려움을 겪는 부분
fast 포인터를 k만큼 움직이고 slow, fast를 동시에 움직여 fast노드가 끝에 도달때까지 반복해 k만큼 떨어진 slow노드를 반환하는것은 이해했습니다.
그런데 fast 노드를 끝까지 보내는 While 문 조건에서 저는 fast.next가 없을 때 가 마지막 노드라고 생각했습니다.
하지만 선생님이 실제로 구현할 때는 이전에 구두로 설명하신것과는 약간 다르게 fast 가 마지막 노드가 아닌 거기서 한번 더 반복되어 fast == None 일때까지 움직여 k번째 노드를 찾으시더라고요.
왜 마지막노드에서 멈추는게 아니라 설명과 좀 다르게 2개의 포인터를 한칸씩 더 움직여 none이 될때까지 움직이도록 했는지 궁금해 강의 끝 시각화 해주신 부분을 봤습니다.
강의 끝에 시각화 하는 부분에서도 첫번째 풀이방법의 답은 10, 두번째 풀이방법의 답은 9가 나오면서 각 풀이방법의 정답이 달라진것 처럼 나오게 됐습니다.
구두로 설명하셨던 것보다 결국 index를 한칸 더 가서 fast가 None이 돼야 정답이 되던데 일반적으로 LinkedList 문제에서 마지막 노드까지 반복문을 돌린다고 가정하면 원래 currentNode가 None이 될때까지 돌려서 푸는건가요???
이렇게 구체적으로 알려주시면, 더 정확하고 도움이 되는 답변을 드릴 수 있습니다! 😊
回答 2
0
안녕하세요 규태님 좋은 질문 감사합니다!!
1. 두 조건 모두 정답이 될 수 있어요
결론부터 말씀드리면, fast.next is None으로 멈추는 것도, fast is None으로 멈추는 것도 둘 다 올바른 접근입니다 다만 "fast를 처음에 몇 칸 미리 이동시키느냐"가 달라져야 합니다.
예를 들어 1→2→3→4→5 리스트에서 "끝에서 2번째 노드(=4)"를 찾는다고 해볼게요.
fast is None 방식 — fast를 k=2칸 먼저 이동하면 node 3에 위치. 두 포인터를 같이 이동시키면서 fast가 None이 될 때까지 반복. slow가 3번 이동해서 node 4 도달 (정답).
fast.next is None 방식 — fast를 똑같이 k=2칸 먼저 이동시켜 node 3에 놓고, fast.next가 None이 될 때까지 반복하면 slow는 2번만 이동해서 node 3에 멈춰요. 한 칸 앞이죠.
같은 k값이더라도 멈추는 조건이 다르면 slow의 최종 위치가 한 칸씩 밀립니다. 그래서 fast.next is None으로 하려면 fast를 k-1칸만 먼저 이동시키거나, 다른 식으로 offset을 조정해야 해요. 강의 시각화에서 10과 9로 갈린 것도 같은 이유예요. 두 방법이 "틀린" 게 아니라 세팅을 맞춰야 같은 답이 나오는 구조입니다.
2. 왜 fast is None 방식이 실전에서 더 선호될까
엣지 케이스 처리가 훨씬 깔끔하기 때문이에요.
리스트 길이가 정확히 k와 같은 경우를 생각해볼게요. 노드가 3개인데 끝에서 3번째(=head)를 찾는 경우입니다.
fast is None 방식은 fast를 3칸 이동시키면 이미 None이 되고, while문에 진입조차 안 하니까 slow는 그대로 head에 남아 정답이 나와요.
fast.next is None 방식은 fast가 None이 된 상태에서 fast.next에 접근하는 순간 NullPointerException(Java)이나 AttributeError(Python)가 터져요. 별도로 fast == None 체크를 추가해줘야 합니다.
이 차이 때문에 LeetCode의 Remove Nth Node From End 같은 대표 문제의 모범답안에서도 while fast: 형태가 압도적으로 많이 쓰여요.
즉, NullPointerException 이 나오지 않는 경우를 선호한다~~
3. LinkedList 반복문 조건은 상황에 따라 달라요
"LinkedList 문제는 보통 current가 None이 될 때까지 돌리는지"에 대한 질문인데, 정해진 하나의 정답은 없고 목적에 따라 갈립니다.
while current: 패턴은 모든 노드를 한 번씩 방문해야 할 때 써요. 값 출력, 개수 세기, 특정 값 찾기, 투 포인터에서 한쪽이 끝을 지나쳐야 정답이 나오는 경우 같은 상황이요.
while current.next: 패턴은 마지막 노드 자체에 대해 뭔가 해야 할 때 씁니다. 예를 들어 리스트 끝에 새 노드를 붙이려면 마지막 노드에서 멈춰야 하고, 중간 노드를 삭제하려면 삭제할 노드의 직전 노드에 접근해야 하잖아요. 이런 경우에는 current.next 조건을 씁니다.
좋은 질문 감사합니다!! 좋은 하루 보내세요 ㅎㅎ
0
안녕하세요, 인프런 AI 인턴입니다.
김규태님, 질문 주셔서 감사합니다!
질문하신 LinkedList에서 fast, slow 포인터를 이용한 K번째 노드 찾기 문제에 대해 설명드리겠습니다.
LinkedList에서 fast 포인터를 먼저 k만큼 움직인 후에 slow와 fast를 함께 움직이면서 fast가 None에 도달했을 때 slow가 가리키는 노드가 끝에서 K번째라는 것을 이해하셨군요.
여기서 fast 포인터가 None이 될 때까지 반복문을 돌리는 이유를 설명드리겠습니다. 이는 마지막 노드를 포함하여 k개의 노드를 앞서 보내기 위함입니다.
fast포인터를k만큼 먼저 전진시킵니다.
- 그런 다음,
slow와fast를 함께 이동시키되fast가None이 될 때까지 이동시킵니다.
이렇게 하는 이유는, fast가 None이 되면 slow가 정확히 끝에서 k번째 노드에 위치하게 되는 것과 같기 때문입니다. fast가 끝 노드를 지나 None에 도달해야만, slow가 정확하게 k번째 노드를 가리키게 됩니다. 이는 일반적으로 LinkedList와 같은 구조에서 빠르게 K번째 노드를 찾는 알고리즘입니다.
보통 LinkedList 문제에서는 currentNode가 None이 될 때까지 반복문을 돌리는 것이 관례입니다. 이는 명확하게 링크드 리스트의 끝을 확인하는 방법이기도 합니다. 김규태님의 질문은 좋은 이해를 돕기 위해 필요한 중요한 논점을 포함하고 있었습니다.
더 궁금하신 부분이 있으면 언제든지 질문해 주세요! 감사합니다. 😊
강의 관련하여 더 많은 정보가 필요하시면 여기를 방문해주세요: 인프런
코딩테스트 처음인데 이런 공부방법이어도 괜찮을까요
0
41
1
3-3 정렬-2 선택정렬 로직
0
33
2
링크드 리스트 끝에서 k번째 값 출력하기
0
36
2
투포인터 시간복잡도
0
46
2
수강평 작성 후 자료
0
47
2
수업교재 링크 오류
2
104
2
프로그래머스에서 제출 후 채점시 틀림ㅠ
0
121
2
1-10 알고리즘 더 풀어보기(2) 질문 있습니다
0
68
2
문제 풀이 방식 관련 질문입니다!
0
80
2
1-5 알고리즘과 친해지기 (2) - 최빈값찾기 질문 있습니다
0
84
2
수업자료 pdf 받고싶습니다
0
101
2
강의 자료 오류 수정
0
68
1
2-10 더하거나 빼거나 관련 질문입니다
0
59
2
3-8 해쉬 -2
0
46
2
Linked List Element Delete Explanation Problem
0
62
2
강의3-4 스택 탑 문제
0
73
2
코드스니펫 입출력 케이스에 오류가 있는것 같아요
0
95
3
링크드 리스트 원소 찾기 구현 방식 질문드립니다.
0
72
2
1874 - 스택 문항
0
79
2
DP Java 예제 자료형 오버플로우 문제
0
96
2
4-9 4주차 숙제중 농심라면 문제
0
104
2
DFS 에서 스택을 사용하는 이유
1
179
3
들여쓰기가 햇갈리네요
0
118
2
강의자료 5일차 11. 카카오 추가 코딩 테스트 - 4 java코드가 잘못되어 있습니다.
0
49
2

