[Swift] [41일차] 2181_LEET

·2025년 1월 17일
0

SwiftAlgorithm

목록 보기
44/105
post-thumbnail

LEETCODE-2191


문제 설명

  1. 링크드리스트라고 주장하는 배열이 주어짐
  2. 여기에서 0을 기준으로 각각 덩어리씩 잘라서 그 덩어리의 합을 배열로 구성
  3. 해당 배열 return

문제 접근

  1. 그냥 반복문 한 번 돌려주면서 저장하던 값을 0나오면 내뱉고 하는 식으로 하면 금방 답이 나올 듯..?

문제 풀이

  1. 그냥 풀려고했더니..
    이렇게 [Int]가 아니라 ListNode로 풀어줘야하더라..
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     public var val: Int
 *     public var next: ListNode?
 *     public init() { self.val = 0; self.next = nil; }
 *     public init(_ val: Int) { self.val = val; self.next = nil; }
 *     public init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
 * }
 */
class Solution {
    func mergeNodes(_ head: ListNode?) -> ListNode? {
    }
}

그래서 XCODE에서 옮겨서 풀곤하는데, 이번에는 여기 주어진대로 head를 또 만들어주기 번거로워서 LEETCODE에서 풀어줬다. [Int]면 너무 쉬운문제일텐데 Medium인 이유는 이 ListNode라는 번거로움에서 책정된것 같기도..?

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     public var val: Int
 *     public var next: ListNode?
 *     public init() { self.val = 0; self.next = nil; }
 *     public init(_ val: Int) { self.val = val; self.next = nil; }
 *     public init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
 * }
 */
class Solution {
    func mergeNodes(_ head: ListNode?) -> ListNode? {
        var current = head
        var tmp_sum = 0
        var answer = [Int]()
        var answer_list = ListNode()
        
        while current != nil{
            
            let current_val = current!.val
            tmp_sum += current_val
            
            if(current_val == 0 ){
                if(tmp_sum != 0) {  //축적된게 0이 아닐때, 그니까 시작과 끝이 아닐때 
                    answer_list.val = tmp_sum
                    print(tmp_sum)

                    answer_list.next = ListNode()
                    tmp_sum = 0
                }
                
            }
            current = current!.next
        }
        return answer_list
    }
}

이렇게 풀다가 좀 막힌 상황이 왔다.
answer_list라는 리스트노드를 만들어서 수행하고 있었는데,
print(tmp_sum)은 정답인 4,11이 나와서 원래대로라면 [4,11] 마지막에 LISTNODE추가해주는 로직이 있어서 그것 감안하더라도 [4,11,0]이 나와야하는데 [11,0]이 계속 나왔다. 이거는 현재꺼에 덧씌워지는 느낌? 인거라 이 부분을 수정해야했다.

풀이 수정

  1. head저장
    계속 커서를 이동해줄 것이니까 여기에 head저장을 만들었다.
	var answer_list = ListNode()
	var answer_head = answer_list
  1. 커서이동을 추가했다.
 answer_list = answer_list.next!  // 추가된 커서이동 
  1. 이제는 이게 끝났을때 마지막에 해당하는 친구[0]를 삭제를 해줘야하는데, 어떻게 할 수 있을지 고민을 해야한다 !
  1. 결국 current.next가 nil이 아닐때만 이 뒤에 꼬리를 추가하는 과정을 수행해주는 것으로 바꿨다.
 if current?.next != nil {
	answer_list.next = ListNode()
	answer_list = answer_list.next!  // 추가된 커서이동 
}
---

최종제출

class Solution {
    func mergeNodes(_ head: ListNode?) -> ListNode? {
        var current = head
        var tmp_sum = 0
        var answer = [Int]()
        var answer_list = ListNode()
        var answer_head = answer_list
        
        while current != nil{
            
            let current_val = current!.val
            tmp_sum += current_val
            
            if(current_val == 0 ){
                if(tmp_sum != 0) {  //축적된게 0이 아닐때, 그니까 시작과 끝이 아닐때 
                    answer_list.val = tmp_sum
                    if current?.next != nil {
                answer_list.next = ListNode()
                    answer_list = answer_list.next!  // 추가된 커서이동 
                    }
                    
                    tmp_sum = 0
                }
                
            }
            current = current!.next
        }
        

        return answer_head
    }

Accepted

39 / 39 testcases passed
Runtime 120ms
Beats 37.50%


타인의 코드

class Solution {
    func mergeNodes(_ head: ListNode?) -> ListNode? {
        var current = head
        var sum = 0
        var dummyHead = ListNode(0)
        var result = dummyHead

        while let node = current {
            if node.val == 0, sum > 0 {
                let newNode = ListNode(sum)
                result.next = newNode
                result = newNode
                sum = 0
            } else {
                sum += node.val
            }

            current = node.next
        }

        return dummyHead.next
    }
}
  1. 보면은 내가 왜 다음꺼를 미리 만들어줬나 싶다. 괜히 그 부분에서 꼬였는데, 그냥 정직하게 0나오면 지금까지한것만 추가를 해주면 되는 것이었다. 빈칸 안만들고,
  2. while current != nil 보다는 while let이 훨씬 swift답게 깔끔한 문법같아서 다음엔 차용해야겠다 싶었다.
  3. 결국 시간차이는 새롭게 0을 뒤에 미리 만들어줄것이냐, 지금 당장 sum만 추가해줄 것이냐 차이였던 것 같다.
profile
기억보단 기록을

0개의 댓글