문제 설명
- 링크드리스트라고 주장하는 배열이 주어짐
- 여기에서 0을 기준으로 각각 덩어리씩 잘라서 그 덩어리의 합을 배열로 구성
- 해당 배열 return
문제 접근
- 그냥 반복문 한 번 돌려주면서 저장하던 값을 0나오면 내뱉고 하는 식으로 하면 금방 답이 나올 듯..?
문제 풀이
- 그냥 풀려고했더니..
이렇게 [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]이 계속 나왔다. 이거는 현재꺼에 덧씌워지는 느낌? 인거라 이 부분을 수정해야했다.
- head저장
계속 커서를 이동해줄 것이니까 여기에 head저장을 만들었다.
var answer_list = ListNode()
var answer_head = answer_list
- 커서이동을 추가했다.
answer_list = answer_list.next! // 추가된 커서이동
- 이제는 이게 끝났을때 마지막에 해당하는 친구[0]를 삭제를 해줘야하는데, 어떻게 할 수 있을지 고민을 해야한다 !
- 결국 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
}
}
- 보면은 내가 왜 다음꺼를 미리 만들어줬나 싶다. 괜히 그 부분에서 꼬였는데, 그냥 정직하게 0나오면 지금까지한것만 추가를 해주면 되는 것이었다. 빈칸 안만들고,
while current != nil
보다는while let
이 훨씬 swift답게 깔끔한 문법같아서 다음엔 차용해야겠다 싶었다.- 결국 시간차이는 새롭게 0을 뒤에 미리 만들어줄것이냐, 지금 당장 sum만 추가해줄 것이냐 차이였던 것 같다.