바위타는 두루미

2.5 리스트의 합 본문

Study/Interview준비

2.5 리스트의 합

DoRoMii 2019. 7. 26. 02:20
728x90

문제 

연결리스트로 숫자를 표현할 때 각 노드가 자릿수 하나를 가리키는 방식으로 표현할 수 있다. 각 숫자는 역순으로 배열되어 있는데, 즉 첫번째 자릿수가 리스트의 맨 앞에 위치하도록 배열된다는 뜻이다. 이와같은 방식으로 표현된 숫자 두 개가 있을 때, 이 두 수를 더하여 그 합을 연결리스트로 반환하는 함수를 작성하라.

 

예제 

입력 (7->1->6) +(5-> 9-> 2) 

출력 ( 2->1-> 9) 

=> 617 + 295 = 912 

 

연관문제

각 자릿수가 정상적으로 배열된다고 가정하고 같은 문제를 풀어보자

 

예제 

입력 (6->1->7) +( 2->9->5) 

출력 ( 9->1->2) 

=> 617 + 295 = 912 

 

해결법

기본 문제는 우리가 덧셈을 하듯이 더한 숫자의 1의 자리 숫자로 노드를 만들고 캐리를 넘김으로써 재귀적으로 해결할 수있다.

class Node:
    def __init__(self, dataval=None):
        self.data = dataval
        self.next = None


def Solution(l1, l2):
    result = add_list(l1,l2,0)
    return result

def add_list(l1,l2,carry):
    if (l1 is None and l2 is None and carry == 0):
        return None
    
    value = carry
    value += l1.data if l1 is not None else 0
    value += l2.data if l2 is not None else 0

    new_node = Node(value%10)
    
    next_node = add_list(l1.next if l1 is not None else None
                         , l2.next if l2 is not None else None
                         , 1 if value >=10 else 0)
    new_node.next = next_node
    
    return new_node

 

연관문제의 해결법

연관문제는 재귀를 사용하고 자릿수를 넘긴다는 점에서 개념적으로는 같지만, 구현하려고 했을때 까다로운 부분들이 있다.

1. 한 리스트가 다른 리스트보다 짧은 경우를 처리해야한다. -> 이 경우는 짧은 리스트 앞쪽에 0을 채워 넣음으로써 해결할 수있다.

2. 이전에서는 계산결과를 꼬리쪽에 붙여나갔지만 이제는 계산결과를 머리쪽에 붙여 나가야하기 때문에 재귀 호출시 만들어진 리스트 결과물 뿐만아니라 carry까지 넘겨야한다.  -> 이부분은 새로운 class를 생성함으로써 해결할 수있다.

 

class partialSum:
    def __init__(self, sum_node = None)
        sum_node = None
        carry = 0

def length(l):
    cnt = 0
    while l is not None:
        cnt +=1
    return cnt

def insertbefore(node, data):
    new_node = Node(data)
    new_node.next = node if node is not None else None
    return new_node

def padding(node, cnt):
    while cnt >0 :
        node = insertbefore(node, 0)
        cnt -= 1
    return node

def make_sum(l1, l2):
    if l1 is None and l2 is None:
        return partialSum(0)

    sum = make_sum(l1.next, l2.next)
    value = sum.carry + l1.data + l2.data
    sum.sum_node = insertbefore(sum.sum_node, value%10)
    sum.carry = 1 if value >= 10 else 0

    return sum

def Solution(l1, l2):
    len_l1 = length(l1)
    len_l2 = length(l2)
    if len_l1 < len_l2 :
        l1 = padding(l1, len_l2 - len_l1)
    elif len_l1 > len_l2 :
        l2 = padding(l2, len_l1- len_l2)

    sum = make_sum(l1, l2)
    if sum.carry > 0 :
        return insertbefore(sum.sum_node, sum.carry)
    else
        return sum.sum_node

'Study > Interview준비' 카테고리의 다른 글

2.8 루프발견  (0) 2019.07.27
2.7 교집합  (0) 2019.07.27
2.4 분할  (0) 2019.07.26
2.2 뒤에서 k번째 원소 구하기  (0) 2019.07.26
2.1 중복 없애기  (0) 2019.07.26
Comments