Skip to content

[Leetcode] 2. Add Two Numbers โ€‹

Problem โ€‹

๋ฌธ์ œ ๋งํฌ ๐Ÿ”—

๋‘๊ฐœ์˜ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ(LinkedList)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ๋Š” ์ˆซ์ž๋ฅผ ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๋ฅดํ‚ค๊ณ ์žˆ๋‹ค. ๋‘๊ฐœ์˜ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ํ•ฉ์„ ๊ตฌํ•˜๊ณ  ๊ตฌํ•œ ๊ฐ’์„ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฆฌํ„ดํ•˜๋Š” ๋ฌธ์ œ.

์—ฌ๊ธฐ์„œ๋Š” ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ๋ฅผ ListNode๋กœ ๊ตฌํ˜„ํ•ด๋†“์Œ.

js
// exam )
linkedList : 2 -> 4 -> 3 // 342

Solution โ€‹

Linked list๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฌธ์ œ.

์ˆซ์ž์˜ ๋ฒ”์œ„๊ฐ€ ๋งค์šฐ ๊ธธ์–ด BigInt๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜๋ฅผ ๊ณ„์‚ฐ 10์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๊ฐ’์„ ๋…ธ๋“œ ๋ฐ์ดํ„ฐ(ListNode)๋กœ ๋งŒ๋“ค๊ณ  head ๋…ธ๋“œ์— ์—ฐ๊ฒฐํ•จ.

  1. ํŒŒ๋ผ๋ฉ”ํƒ€๋กœ ๋‚ด๋ ค์˜จ ๋…ธ๋“œ๋ฅผ ์ˆซ์ž๋กœ ๋ฐ”๊พธ๋Š” ์ž‘์—….
  2. ์ˆซ์ž๋กœ ๋ฐ”๊พผ ๋‘ ๊ฐ’์„ ๋”ํ•จ
  3. ํ•ฉํ•œ ๊ฐ’์—์„œ 10์˜ ๋‚˜๋จธ์ง€๋ฅผ head ๋…ธ๋“œ์— ์—ฐ๊ฒฐ. ๊ทธ๋ฆฌ๊ณ  ํ•ฉํ•œ ๊ฐ’์„ 10์”ฉ ๋‚˜๋ˆ ์ฃผ๋ฉด์„œ ์ž๋ฆฟ์ˆ˜๋ฅผ ์ค„์ž„.
  4. head ๋…ธ๋“œ์— temp๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ’์„๋“ค ์ด์–ด๋ถ™์ž„.
  5. head ๋…ธ๋“œ์˜ ์—ญํ• ์€ ์ฒซ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋ฅดํ‚ค๋Š” ์—ญํ• 

JS Code โ€‹

javascript
/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function(l1, l2) {
    return toNode(
            toBigNumber(l1) + toBigNumber(l2)
        )

};

const toBigNumber = (node) => {
    let sum = 0n;
    let digit = 1n
    let temp = node
    
    while(temp) {
        sum += BigInt(temp.val) * digit
        temp = temp.next
        digit *= 10n
    }
    
    return sum
}

const toNode = (num) => {
    if (num === 0n) return new ListNode(0)
    
    let head = new ListNode()
    let temp = new ListNode()
    while(num > 0) {
        const last = num % 10n
        temp.next = new ListNode(last)
        if (!head.next) head.next = temp.next
        num /= 10n
        temp = temp.next
    }
    
    return head.next
}