[Leetcode/Medium] 두 수의 덧셈 (2. Add Two Numbers, Swift)
2024. 7. 10. 14:09ㆍAlgorithm
https://leetcode.com/problems/add-two-numbers/
🤔 문제 설명
음이 아닌 정수를 나타내는 두 개의 연결 리스트가 제공된다.
각 연결 리스트는 역순으로 저장되어 있으며, 두 숫자를 더하고 합계를 연결 리스트로 반환하라.
l1 = [2,4,3], l2 = [5,6,4]
// [7,0,8] (342 + 465 = 807)
💡 풀이
첫 번째 생각했던 방식은 아래와 같다. *조금 복잡하니까 읽어보고 싶은 사람만 천천히 읽어볼 것
- l1과 l2를 끝에까지 이동하면서 각각을 배열로 저장한 후, reversed로 뒤집고, 정수로 바꾼다. (ex. [2,4,3] -> [3,4,2] -> 342)
- 두 정수 값을 더하고, 다시 배열로 저장한 후, reversed로 뒤집는다. (807 -> [8,0,7] -> [7,0,8])
- 배열을 하나씩 반복하면서 연결 리스트로 차근차근 연결해 나간다.
하지만, 이 풀이가 딱 보이는 것과 같이 연결 리스트에서 Array로, Array에서 Int로 이어지는 비효율적인 풀이이기 때문에 Linked List의 특성 자체를 이용할 방법을 생각하게 되었다.
그리고 다시 문제를 봤을 때 그 자체로 연산이 가능하도록 두 번씩이나 뒤집는 이유를 알게 되었다고 한다...ㅎ..예시 문제를 기준으로 설명해 보겠다.
- 첫 번째 l1과 l2 연결 리스트의 값 연산 (2 + 5 = 7)
- 한 칸 이동, 두 번째 l1과 l2 연결 리스트의 값 연산 (4 + 6 = 10), 끝 자리만 넣어야 하기 때문에 % 연산자 필요! (10 % 10 = 0)
- 한 칸 이동, 세 번째 l1과 l2 연결 리스트의 값 연산 (3 + 4 = 7) + 앞에서 넘어온 앞자리 (10 / 10 = 1) 추가
즉, 보면 알겠지만 연결 리스트의 값을 순차적으로 이동하면서 % 연산 값은 연결 리스트의 val 값으로 연결, / 연산 값은 다음 연산으로 연결의 반복인 것을 확인할 수 있었다.
🧑🏻💻 코드 (Swift ver.)
💡 Runtime : 20ms (Beats 57.46%), Memory : 15.23MB (Beats 93.34%)
class Solution {
func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
var result: ListNode = ListNode(0) // 최종 결과 반환할 노드 (next부터)
var current: ListNode? = result // 이동하면서 노드 추가
var list1: ListNode? = l1 // l1
var list2: ListNode? = l2 // l2
var next: Int = 0 // 연산 값이 두자릿수일 떄 다음 값으로 넘길 값
// 연산을 계속할 수 있을 때까지 반복 (l1이나 l2나 next값 중 하나라도 있는 경우)
while (list1 != nil || list2 != nil || next != 0) {
let sum = (list1?.val ?? 0) + (list2?.val ?? 0) + next
next = sum/10
current!.next = ListNode(sum%10)
current = current!.next
// 다음 l1, l2 이동
if (list1 != nil) { list1 = list1!.next }
if (list2 != nil) { list2 = list2!.next }
}
return result.next
}
}
'Algorithm' 카테고리의 다른 글
[Leetcode/Easy] 유효한 괄호 (20. Valid Parentheses, Swift) (0) | 2024.07.12 |
---|---|
[Leetcode/Medium] 홀짝 연결 리스트 (328. Odd Even Linked List, Swift) (0) | 2024.07.11 |
[Leetcode/Medium] 페어의 노드 스왑 (24. Swap Nodes in Pairs, Swift) (0) | 2024.07.10 |
[Leetcode/Easy] 두 정렬 리스트의 병합 (21. Merge Two Sorted Lists, Swift) (0) | 2024.07.09 |
[Leetcode/Easy] 역순 연결 리스트 (206. Reverse Linked List, Swift) (0) | 2024.07.07 |