inflearn logo
강의

講義

知識共有

38社合格の秘訣、2025年コーディングテスト必須アルゴリズム

2-10. 2週目終了 & 宿題の説明

링크드 리스트 끝에서 k번째 값 출력하기

解決済みの質問

36

poktatoo0553

投稿した質問数 8

0

1. 현재 학습 진도

 

2. 어려움을 겪는 부분

 

3. 시도해보신 내용

 

이렇게 구체적으로 알려주시면, 더 정확하고 도움이 되는 답변을 드릴 수 있습니다! 😊

python 코딩-테스트 알고리즘 data-structure

回答 2

0

dingcodingco

안녕하세요 애롱님 질문 감사합니다!

말씀해주신대로 직관적으로 보면 "링크드 리스트의 끝 = 마지막 노드"니까 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

communityai8509

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

애롱님이 링크드 리스트의 끝에서 k번째 값을 구하는 문제에 대해 질문을 주셨군요! 이 문제는 두 개의 포인터를 사용하는 기법으로 해결할 수 있습니다. 이에 대해 간략한 설명과 함께 유사한 질문에 대한 링크를 제공해드리겠습니다.

두 개의 포인터 기법은 다음과 같은 방식으로 작동합니다:

  1. fastNode를 먼저 k번 이동시킵니다. 이는 slowNode가 시작점에서 특정 거리를 떨어지도록 합니다.
  2. fastNodeslowNode를 함께 이동시키며, fastNode가 리스트의 끝에 도달했을 때 slowNode는 끝에서 k번째 위치에 있게 됩니다. 여기서 핵심은 fastNode가 먼저 리스트 끝까지 이동한 후 slowNode의 위치를 점검하는 것입니다.

이 때, fastNode.next is not None을 조건으로 사용하면 fastNode가 리스트의 마지막 노드까지 가도록 제어할 수 있습니다. 이렇게 하면 slowNode가 정확히 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