Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 2c06b4d

Browse files
authoredJun 23, 2025
Merge pull request #1593 from KwonNayeon/main
[KwonNayeon] Week 12 solutions
2 parents dbbe77f + 4dc8185 commit 2c06b4d

File tree

4 files changed

+41
-58
lines changed

4 files changed

+41
-58
lines changed
 

‎remove-nth-node-from-end-of-list/KwonNayeon.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@
1212
- 추가 공간을 사용하지 않음, 정해진 개수의 변수만 사용
1313
1414
풀이방법:
15-
1. fast 포인터를 n번 앞으로 이동
16-
2. base case: 만약 fast가 None이라면, 첫 번째 노드를 제거함
15+
- 투 포인터 기법: 두 포인터 사이의 고정된 간격(n)을 이용하여 fast가 끝에 도달했을 때 slow가 정확한 위치에 있도록 함
16+
1. fast 포인터를 n번 이동시켜 slow와 n칸 간격을 만듦
17+
2. Base case: fast가 None이면 첫 번째 노드를 삭제 (head.next 반환)
1718
3. fast.next가 None일 때까지 두 포인터를 함께 이동
18-
4. slow의 다음 노드를 제거함 (slow.next = slow.next.next로 연결을 끊어냄)
19+
-> 이때 slow는 삭제할 노드의 바로 앞 위치에 도달
20+
4. slow.next = slow.next.next로 삭제할 노드를 건너뛰도록 연결 변경
1921
"""
2022
# Definition for singly-linked list.
2123
# class ListNode:

‎reorder-list/KwonNayeon.py

Lines changed: 29 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
- 포인터들을 번갈아가며 연결함
2222
2323
노트:
24-
- 포인터 조작(연결리스트 뒤집기, 병합) 방법을 다 까먹어서 복습용 예시 주석을 추가해둠
24+
- 포인터 조작(연결리스트 뒤집기, 병합)이 어려움. 스택 풀이도 준비해두기.
2525
"""
2626
# Definition for singly-linked list.
2727
# class ListNode:
@@ -31,60 +31,38 @@
3131
class Solution:
3232
def reorderList(self, head: Optional[ListNode]) -> None:
3333
# 초기 상태: 1->2->3->4->5
34-
34+
"""
35+
Do not return anything, modify head in-place instead.
36+
"""
3537
# 1단계: 중간 지점 찾기
36-
slow = head # slow = 1
37-
fast = head # fast = 1
38+
slow = head
39+
fast = head
40+
3841
while fast and fast.next:
39-
slow = slow.next # slow: 1->2->3
40-
fast = fast.next.next # fast: 1->3->5->None
41-
# 결과: slow는 3에 위치
42-
42+
slow = slow.next
43+
fast = fast.next.next
44+
4345
# 2단계: 뒷부분 뒤집기
44-
prev = None # prev = None
45-
curr = slow.next # curr = 4 (뒷부분 시작점)
46+
prev = None
47+
curr = slow.next
4648
slow.next = None # 분리: 1->2->3 | 4->5
47-
49+
4850
while curr:
49-
# 1회전: curr=4, prev=None
50-
next_temp = curr.next # next_temp = 5
51-
curr.next = prev # 4->None
52-
prev = curr # prev = 4
53-
curr = next_temp # curr = 5
54-
# 상태: 1->2->3 | 4->None, curr=5
55-
56-
# 2회전: curr=5, prev=4
57-
next_temp = curr.next # next_temp = None
58-
curr.next = prev # 5->4
59-
prev = curr # prev = 5
60-
curr = next_temp # curr = None (종료)
61-
# 상태: 1->2->3 | 5->4->None
62-
51+
next_temp = curr.next
52+
curr.next = prev
53+
prev = curr
54+
curr = next_temp
55+
6356
# 3단계: 앞부분과 뒷부분 합치기
64-
first = head # first = 1->2->3
65-
second = prev # second = 5->4
66-
57+
first = head
58+
second = prev
59+
6760
while second:
68-
# 1회전: first=1, second=5
69-
temp1 = first.next # temp1 = 2
70-
temp2 = second.next # temp2 = 4
71-
72-
first.next = second # 1->5
73-
second.next = temp1 # 5->2
74-
# 현재 상태: 1->5->2->3, 남은 second = 4
75-
76-
first = temp1 # first = 2
77-
second = temp2 # second = 4
78-
79-
# 2회전: first=2, second=4
80-
temp1 = first.next # temp1 = 3
81-
temp2 = second.next # temp2 = None
82-
83-
first.next = second # 2->4
84-
second.next = temp1 # 4->3
85-
# 현재 상태: 1->5->2->4->3
86-
87-
first = temp1 # first = 3
88-
second = temp2 # second = None (종료)
89-
90-
# 최종 결과: 1->5->2->4->3
61+
temp1 = first.next
62+
temp2 = second.next
63+
64+
first.next = second
65+
second.next = temp1
66+
67+
first = temp1
68+
second = temp2

‎reverse-linked-list/KwonNayeon.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,14 @@ def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
3939
prev = None
4040
curr = head
4141

42-
while curr is not None:
42+
# while문 조건 - 마지막 노드도 처리해야 함
43+
while curr:
4344

4445
temp = curr.next
4546
curr.next = prev
47+
48+
# prev: 지금까지 뒤집어진 부분의 시작점
49+
# curr: 아직 처리 안 한 부분의 시작점
4650
prev = curr
4751
curr = temp
4852

‎same-tree/KwonNayeon.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
풀이방법:
1313
1. DFS와 재귀를 활용하여 두 트리를 동시에 탐색
1414
2. base case:
15-
- p와 q가 모두 None이면 → 같은 트리
16-
- 둘 중 하나만 None이거나 노드의 값이 다르면 → 다른 트리
15+
- p와 q가 모두 None일 때: 같은 트리
16+
- 둘 중 하나만 None이거나 노드의 값이 다를 때: 다른 트리
1717
3. 재귀로 왼쪽과 오른쪽 서브트리가 모두 같은지 확인
1818
"""
1919
# Definition for a binary tree node.
@@ -31,4 +31,3 @@ def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:
3131
return False
3232

3333
return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)
34-

0 commit comments

Comments
 (0)
Please sign in to comment.