바위타는 두루미

2.1 중복 없애기 본문

Study/Interview준비

2.1 중복 없애기

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

문제 

정렬되어 있지 않은 연결 리스트가 주어졌을때 이 리스트에서 중복되는 원소를 제거하는 코드를 작성하라 

[연관문제] 임시 버퍼를 사용할 수 없다면 어떻게 풀까?

 

해결법

1. 중복되는 원소를 hash table로 추적해 나가며, 중복원소를 제거 

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

def Solution(node):
    data_set = set()
    prev = None
    
    while node is not None:
        if node.data in data_set:
            prev.next = node.next
        else :
            set.add(node.data)
            prev = node
        node = node.next
    return

배운점

해법에 HashSet과 같은것을 python에서 찾아보다가 python에서 set은 dictionary로 만들어진 자료구조기 때문에 find작업이 O(1)으로 같은 기능을 나타낸다는 것을 알아냈다.

또한 너무 쉽게 생각하고 짜다가 node.next = node.next.next 라는 말도안되는 코드를 짤 뻔 하며 prev 변수의 필요성을 생각하지 못했는데 linked list에서 현재노드와 이전노드 다음노드를 잘 생각하면서 코드를 만들어야겠다는 반성을 했다.

 

2. (버퍼가 없을때) Runner 기법을 이용한다

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

def Solution(node):
    cur_node = node
    runner_node = None
    while  cur_node is not None:
        runner_node = cur_node
        while runner_node is not None:
            if runner_node.next.data == cur_node.data :
                runner_node.next = runner_node.next.next
            else :
                runner_node = runner_node.next
        cur_node = cur_node.next
    return

 

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

2.4 분할  (0) 2019.07.26
2.2 뒤에서 k번째 원소 구하기  (0) 2019.07.26
1.8 0 행렬  (0) 2019.07.25
1.6 문자열 압축  (0) 2019.07.25
1.5 하나빼기  (0) 2019.07.25
Comments