DevLog

[패스트캠퍼스 :: 코딩테스트 인강] 2주차 ① 연결리스트/링크드리스트 본문

IT 개발/Algorithm 알고리즘

[패스트캠퍼스 :: 코딩테스트 인강] 2주차 ① 연결리스트/링크드리스트

Euniverse 2021. 2. 25. 02:01

알고리즘/기술면접 완전 정복 올인원 패키지 Online

 

11. 링크드 리스트 (Linked List) - 1

12. 링크드 리스트 (Linked List) - 2

13. 링크드 리스트 (Linked List) - 3


시간이 늦어서 하나 더 못 듣고 3개만 듣자

잠시 노가리 TMI 

 

사실 나는 지금 수강하고 있는 강의를 유튜브에서도 유명한 '나동빈'님이 강사에 포함되어 있어서

(물론 이미 코딩 테스트 관련 영상이 유튜브 채널에 업로드되어있지만 유료 강의는 또 뭐가 다를까 궁금하기도 했다.)

수강을 결정하고, 지금 100% 환급 챌린지도 진행하게 되었다. 

 

근데 진짜 진심으로 이 글을 패스트캠퍼스 관계자가 볼 수도 있고, 해당 강사님이 볼 수도 있겠지만...

지금 이 시점에서 강의를 해주시는 (강사 세 분 중 한 분) '이준희' 강사님이 너무 마음에 들고 아주 아주 만족스럽다는 글을 꼭 남기고 싶었다. 알고 있는 사람도 있을 것이고, 이 분도 직접 사이트(?)를 운영하고 계신 것 같은데 자료를 봤을 수도 있을 것 같다. 

 

솔직히 처음에 1강을 열고, 첫인상은 나이가 지긋해 보이셔서 '어라 교수님 스타일이려나...'라는 걱정에 지루하면 어쩌지 라는 생각을 했었는데 역시 걱정은 사서 하는 것이 아닌 것 같다.

물론 개인차가 있겠지만 내 기준 너무 재밌고, '하 조금 어려..우...'라는 생각을 함과 동시에 강의 영상에서 "네 어렵죠? 저도 어렵습니다. 저도 처음에는 몇 시간씩 걸렸습니다." 등 마음을 따스하게(?) ㅋㅋㅋㅋ 해주시는 말들을 어찌나 타이밍 좋게 해 주시는지....

 

아무튼 혹시나 강의를 고민하고 있거나 첫 맛보기 강의를 보고 지레 겁먹는 사람이 있다면,

그 걱정은 고이 접어서 일단 주머니에 넣고 공부를 시작했으면 좋겠다!

 


연결 리스트 / 링크드 리스트 (Linked List)

 

필요 선수 지식 : 배열, 파이썬 객체지향 프로그래밍, 함수 정의, class 정의, 매개변수

 

  • 배열은 순차적으로 연결된 공간에 데이터를 나열하는 데이터 구조이다.

  • 링크드 리스트는 배열의 단점을 보완하기 위해 떨어진 곳에 존재하는 데이터를 포인터로 연결해서 관리하는 데이터 구조이다.

  • 기본 구조 : 노드 + 포인터

  • 장점은 기본 배열과는 달리 데이터 공간을 미리 할당하지 않아도 되는 점이다.

  • 단점은 배열의 단점을 보완해서 데이터 저장공간도 보완이 되었다고 생각할 수 있지만 연결 리스트 특성상 데이터와 포인터가 하나의 노드에 포함되어야 하기 때문에 효율이 높지 않다.

  • 또한, 배열에서는 인덱스 기법으로 포함하는 원소의 위치에 빠르게 접근이 가능했지만 연결 리스트에서는 포인터를 활용하여 하나하나 원소를 찾아가야 하기 때문에 속도가 느리다.

 

 

연결 리스트

 

 

위의 그림에 나오는 것처럼 Node / data / next는 연결 리스트 관련 함수를 정의할 때도 사용하게 된다. 

 

class Node: # Node 객체를 생성하기 위한 class 정의
    def __init__(self, data, next=None):
        self.data = data # 데이터
        self.next = next # 포인터
    
class NodeMgmt: # Node 관련 Management 함수 정의 위한 클래스
    def __init__(self, data): # 초기값 정의
        self.head = Node(data)
        
    def add(self, data): # 연결리스트 삽입
        if self.head == '':
            self.head = Node(data)
        else:
            node = self.head
            while node.next:
                node = node.next
            node.next = Node(data)
        
    def desc(self): # 전체 연결리스트 출력
        node = self.head
        while node:
            print (node.data)
            node = node.next
    
    def delete(self, data): # 연결리스트 삭제
        if self.head == '':
            print ("해당 값을 가진 노드가 없습니다.")
            return
        
        if self.head.data == data:
            temp = self.head
            self.head = self.head.next
            del temp
        else:
            node = self.head
            while node.next:
                if node.next.data == data:
                    temp = node.next
                    node.next = node.next.next
                    del temp
                    return
                else:
                    node = node.next

 

연결 리스트 개념에서 활용되는 함수를 정의한 코드이다.

 


이번 강의를 통해 매번 헷갈렸던 연결 리스트 자료구조를 거의 90% 이상 이해를 할 수 있게 되었다.

아직 완벽하게 혼자 코드를 짜는 것은 버벅거림이 없지 않아 있지만,

계속 계속해 볼 예정이다.

 

개념이 잡혔으니 생각하면서 코드를 작성해 보고 이게 또 기계적으로 될 수 있게 반복이 답인 것 같다.

프로그래밍은 반복 또 반복이 답이란 것을 매일 느낀다. 

 

겁나던 연결 리스트를 해내고 나니 또 뒷 걱정이 생기긴 하지만

강사님께서 마지막에 하신 '지금 연결 리스트를 듣고 강의를 접을 생각을 하실 수도 있지만...'에서 조금 뜨끔했다.

근데 뒤이어 '여기까지 하시면 앞으로도 잘할 수 있다' 고 용기를 주셨다. ^___^

 

해보자.

 

[패스트캠퍼스 100% 환급 챌린지 미션 중입니다.]

 

 

 

알고리즘 / 기술면접 완전 정복 올인원 패키지 Online. | 패스트캠퍼스

오직 개발자 취업을 위해 만든 알고리즘/기술면접 완벽 대비 강의

www.fastcampus.co.kr