오전에 알고리즘 세션과 알고리즘 강의 1주차를 마저 들으려 했는데, 연결리스트에 막혀서 진도가 전혀 안나간다.
일단 자료배열과 알고리즘, 빅O로 표현하는 시간복잡도를 최소로 하기 위한 컴퓨터적 사고가 좋은 개발자가 되기 위해선 필요하다. 영상으로 된 강의자료를 보고 그 필요성은 확실히 인지했지만, 내가 그렇게 될 수 있을지를 잘 모르겠다. 강의 중 질문이나 알고리즘 코드카타에서 일단 코드를 구현하는 것 자체가 시간이 많이 드는데, 약간 벽에 막힌 느낌이다.
연결리스트는 정의는 거의 이해했는데, 이를 구현하는 건 전혀 다른 문제같다.
일단 강의에서 진행한 코드도 파이참의 디버깅을 활용해서 계속 뜯어봤는데 확실하게 이해하지를 못하겠다. 내 식으로 일단 정의만 적어보자면,
- 노드 안엔 이후 class로 생성할 인스턴스(노드)의 value값과 다음 노드의 주소값이 포함되어야한다. 그러기 위한 node 생성 클래스가 우선적으로 필요하고
- 단순연결리스트는 주소가 다음 노드의 주소만을 갖기 때문에 node.next, node.next.next 순으로 직접 노드생성 클래스 값을 입력해줄 수 있다.
- 그리고 강의에선
class LinkedList: def __init__(self): self.head = None
def append(self, val): if not self.head: self.head = ListNode(val, None) return
node = self.head while node.next: node = node.next node.next = ListNode(val, None)
이런식으로 연결리스트를 한번에 구현해낸건지 모르겠는데 참고한 블로그에서 보기로는
append 함수가 맨 뒤의 노드에 삽입하는 것으로 보인다.
블로그에선#but when the list def addBack(self, val): #O(n) node = ListNode(val) crnt_node = self.head while crnt_node.next: crnt_node = crnt_node.next crnt_node.next = node
이런식으로 구현했는데 두 코드가 같은건 알겠지만 어떤식으로 작동하는지는 아직도 정확하게 모르겠다. 일단 while문 이후에 crnt_node.next = node의 node값을 그냥 처음의 리스트 생성 함수에 넣은 것이 가장 큰 차이점같다.