Skip to content

Conversation

YeomChaeeun
Copy link
Contributor

@YeomChaeeun YeomChaeeun commented Jan 20, 2025

답안 제출 문제

체크 리스트

  • 우측 메뉴에서 PR을 Projects에 추가해주세요.
  • Projects의 오른쪽 버튼(▼)을 눌러 확장한 뒤, Week를 현재 주차로 설정해주세요.
  • 바로 앞에 PR을 열어주신 분을 코드 검토자로 지정해주세요.
  • 문제를 모두 푸시면 프로젝트에서 StatusIn Review로 설정해주세요.
  • 코드 검토자 1분 이상으로부터 승인을 받으셨다면 PR을 병합해주세요.

@YeomChaeeun YeomChaeeun requested a review from a team as a code owner January 20, 2025 09:24
@github-actions github-actions bot added the ts label Jan 20, 2025
Copy link
Contributor

@gwbaik9717 gwbaik9717 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

안녕하세요, @YeomChaeeun 님! 코드 공유해주셔서 감사드립니다. 아직 푸시는 중으로 파악되는데 현재까지 진행해주신 커밋에 대해서 몇 가지 코멘트를 남겨보았어요!

}

// 마지막 노드에 도달할 때까지 계속 재귀 호출
const newHead = reverseList(head.next)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

혹시 이 문제를 재귀를 이용해서 푸신 이유를 여쭤볼 수 있을까요? 만약 재귀 대신에 스택과 for문을 함께 사용한다면 공간복잡도가 이론적으로는 O(n) 으로 동일합니다만, 실제로는 재귀 방식이 더 많이 차지할 것 같습니다. (함수의 실행 컨텍스트가 콜스택에 계속해서 쌓이기 떄문에)

image

실제로 위 코드를 스택으로 푼 것과 비교를 위해 돌려봤는데요, 꽤나 큰 차이가 나더라구요. 그래서 재귀로 푸신 이유가 있는지 궁금했습니다.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아, 추가로 아래는 제가 위 메모리 비교 테스트에 쓰인 이전에 스택으로 풀었을 때의 코드인데 혹시 필요하실까봐 첨부드려요!

/**
* Definition for singly-linked list.
* function ListNode(val, next) {
*     this.val = (val===undefined ? 0 : val)
*     this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function(head) {
   const stack = []

   let temp = head
   while (temp){
       stack.push(temp.val)
       temp = temp.next
   }

   if (!stack.length){
       return null
   }

   const popped = stack.pop()
   const answer = new ListNode(popped)
   
   temp = answer
   while (stack.length > 0){
       const popped = stack.pop()

       temp.next = new ListNode(popped)
       temp = temp.next
   }

   return answer
};

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오 좋은 방법 알려주셔서 감사합니다! 😊

const newHead = reverseList(head.next)

// 백트래킹 과정
head.next.next = head
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

개인적으로 이 부분이 코드를 읽을 때 직관적이다라는 생각이 들지 않았습니다. 얼핏 읽었을 때 "head 의 다음의 다음 노드가 다시 head?" 인데 확 와닿지는 않더라구요. 그렇다고 재귀로 풀었을 때 더 나은 방법이 있나 생각해보면 또 다른 방법은 잘 떠오르진 않네요!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

앞뒤를 바꿔주는 작업이라고 생각하면 될거같아요 ^^
저도 여러 그림을 그려가며 백트래킹으로 풀어나갔던 것인데 stack도 한번 시도해보겠습니다
감사합니다 👍

@YeomChaeeun YeomChaeeun merged commit 1a003ec into DaleStudy:main Jan 25, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
No open projects
Status: Completed
Development

Successfully merging this pull request may close these issues.

2 participants