Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[YeomChaeeun] Week 7 #930

Merged
merged 2 commits into from
Jan 25, 2025
Merged

[YeomChaeeun] Week 7 #930

merged 2 commits into from
Jan 25, 2025

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
Status: Completed
Development

Successfully merging this pull request may close these issues.

2 participants