링크드 리스트 끝에서 k번째 값 출력하기
1. 현재 학습 진도
몇 챕터/몇 강을 수강 중이신가요? 2주차
어떤 알고리즘을 학습하고 계신가요? 2주차 숙제
여기까지 이해하신 내용은 무엇인가요? 링크드리스트, 재귀
2. 어려움을 겪는 부분
어느 부분에서 막히셨나요? 2주차 숙제 1번
끝에서 k번째를 구하는게 문제잖아요? 근데 정답 코드를 보면 fastNode는 끝이 아닌 끝보다 한칸 더간거고, slownode(정답이 될)는 한칸 더간 fastnode에서 k번째 떨어질 경우 답이 되는데 while문을 fastnode.next is not None의 조건을 해줘야 링크드 리스트 끝에서 라는 문제의 의미에 더 맞지 않나요?
3. 시도해보신 내용
문제 해결을 위해 어떤 시도를 해보셨나요?
에러가 발생했다면 어떤 에러인가요?
현재 작성하신 코드를 공유해주세요
이렇게 구체적으로 알려주시면, 더 정확하고 도움이 되는 답변을 드릴 수 있습니다! 😊
回答 2
0
안녕하세요 애롱님 질문 감사합니다!
말씀해주신대로 직관적으로 보면 "링크드 리스트의 끝 = 마지막 노드"니까 fast.next is not None이 더 자연스러워 보입니다! 그런데 코드를 직접 트레이스해보면 왜 답안에서 fast is not None을 쓰는지 이유가 보일 거예요. 같이 따라가봐요.
1. 답안 코드 트레이스 (while fast is not None)
리스트가 [6] → [7] → [8]이고 k=2인 상황이에요. 정답은 7이죠.
초기 상태에서 slow와 fast 둘 다 head(6)에 있어요. for i in range(k) 즉 2번 반복하면서 fast를 움직이면 fast는 7을 거쳐 8에 도착해요. 이제 slow=6, fast=8, 둘의 간격은 정확히 k=2입니다.
while문에 들어가면 fast=8은 None이 아니니까 한 번 진입해서 둘 다 한 칸씩 이동해요. slow=7, fast=None(8.next)이 되고, 다음 조건 검사에서 종료. slow=7 반환 → 정답
2. 만약 while fast.next is not None을 쓴다면?
같은 초기 상태(slow=6, fast=8)에서 시작해요. 그런데 fast.next는 이미 None이라서 while문에 한 번도 들어가지 못해요. 그대로 slow=6 반환 → 오답 ✗
즉, 지금 답안 코드의 셋업(for i in range(k)로 fast를 k칸 이동) 위에서는 fast.next is not None을 쓰면 답이 한 칸 어긋나버려요.
3. 그럼 왜 fast가 끝을 한 칸 넘어갈까?
이 알고리즘의 핵심은 "두 포인터의 간격을 k로 만들어서, fast가 멈췄을 때 slow가 끝에서 k번째에 있게 한다"예요. 여기서 "fast가 멈추는 지점"을 어디로 잡느냐에 따라 초기 이동 횟수가 달라져요.
답안은 이렇게 잡은 거예요. fast가 None(=마지막 다음 칸, 즉 "더 이상 노드가 없는 상태")일 때 slow가 "끝에서 k번째"가 되도록 수식을 맞춘 것. 이렇게 하면 처음에 fast를 정확히 k번 이동시키면 되니까 코드가 깔끔해져요.
만약 "fast는 마지막 노드에서 멈춰야지!"라는 직관을 살리고 싶으면, 초기 셋업을 한 칸 줄이면 돼요.
def get_kth_node_from_last(self, k):
slow = self.head
fast = self.head
for i in range(k - 1): # k가 아니라 k-1번 이동
fast = fast.next
while fast.next is not None: # 마지막 노드에서 멈춤
slow = slow.next
fast = fast.next
return slow
같은 예시로 트레이스하면, 처음에 fast가 1번 이동해서 7로 가요(slow=6, fast=7, 간격=1... 어? 이상한데?).
여기서 또 하나 헷갈릴 수 있는 포인트가 나와요. 간격이 k가 아니라 k-1인 것처럼 보이지만, 사실 fast의 "최종 멈추는 지점"이 한 칸 앞당겨진 거(None이 아니라 마지막 노드)라서 결과적으로 동일하게 동작해요. while문 한 번 진입 후 slow=7, fast=8이 되고 fast.next=None이라 종료. slow=7 ✓
정리해보면 다음과 같습니다 두 방식 다 정답이고, 차이는 단지 "fast가 어디서 멈추는가"라는 종료 지점 정의의 차이일 뿐이에요. 답안에서 fast is not None을 쓴 건 이게 더 일반적이고 변형 문제(예: 끝에서 k번째 노드 삭제)로 확장할 때 더 편하기 때문이에요. 마지막 노드의 "이전 노드"가 필요한 경우가 많은데, 그때 slow가 자연스럽게 그 위치에 오거든요.
좋은 질문 감사합니다 좋은 하루 보내세요!!
0
안녕하세요, 인프런 AI 인턴입니다.
애롱님이 링크드 리스트의 끝에서 k번째 값을 구하는 문제에 대해 질문을 주셨군요! 이 문제는 두 개의 포인터를 사용하는 기법으로 해결할 수 있습니다. 이에 대해 간략한 설명과 함께 유사한 질문에 대한 링크를 제공해드리겠습니다.
두 개의 포인터 기법은 다음과 같은 방식으로 작동합니다:
fastNode를 먼저 k번 이동시킵니다. 이는slowNode가 시작점에서 특정 거리를 떨어지도록 합니다.
fastNode와slowNode를 함께 이동시키며,fastNode가 리스트의 끝에 도달했을 때slowNode는 끝에서 k번째 위치에 있게 됩니다. 여기서 핵심은fastNode가 먼저 리스트 끝까지 이동한 후slowNode의 위치를 점검하는 것입니다.
이 때, fastNode.next is not None을 조건으로 사용하면 fastNode가 리스트의 마지막 노드까지 가도록 제어할 수 있습니다. 이렇게 하면 slowNode가 정확히 k번째 위치에 있을 수 있게 됩니다.
관련 내용을 더 깊게 이해하고 싶은 경우, 아래 링크를 참고하시면 도움이 될 것입니다.
- k번째 값 출력하기 문제에서 이렇게 풀어도 되나요?
이 링크는 링크드 리스트의 특정 위치 값 출력에 대한 다양한 방법을 다루고 있어서 참고하시기에 좋습니다. 각 방법의 장단점과 효율성에 대해서도 논의가 되어 있습니다.
이해에 도움이 되셨기를 바랍니다. 추가적으로 궁금한 점이 있으면 언제든지 질문해 주세요.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드립니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
코딩테스트 처음인데 이런 공부방법이어도 괜찮을까요
0
41
1
3-3 정렬-2 선택정렬 로직
0
33
2
LinkedList 과제 Fast, slow 포인터
0
44
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

