💻 컴퓨터공학
이진 트리 (Binary Tree)
이진 트리 (Binary Tree)
2021.10.26Binary Tree 🙂 이진 트리(Binary Tree)는 최대 2개의 자식을 가질 수 있는 노드들로 구성된 트리입니다. 데이터를 2개까지만 담을 수 있어 저장의 용도로 쓰기에는 조금 아쉬운 트리이지만, 데이터를 아주 빠르게 찾을 수 있는 이진 탐색(Binary Search)이나 수식을 트리 형태로 표현하여 계산하는 수식 트리(Expression Tree) 등에 활용할 수 있는 개성 넘치는 트리입니다. 이진 트리의 종류로 포화 이진 트리(FBT: Full Binary Tree)와 완전 이진 트리(CBT: Complete Binary Tree)라는 것도 있습니다. 포화 이진 트리는 잎이 되는 모든 노드가 채워진 이진 트리를 의미하고, 완전 이진 트리는 잎이 되는 노드들이 왼쪽부터 빼곡하게 자리를 채운 트..
LCRS 트리 (LCRS Tree)
LCRS 트리 (LCRS Tree)
2021.10.25LCRS Tree 🙂 LCRS 트리에서 LCRS는 Left Child, Right Siblings를 의미합니다. 그렇기에 이 트리는 왼쪽에는 자식이 붙고, 오른쪽에는 형제 노드만 붙는 형태의 트리라 볼 수 있습니다. 일반적으로 트리를 표현하는 방법은 다소 복잡한 편이지만, 이 트리는 왼쪽 자식에 대한 포인터와 오른쪽 형제에 대한 포인터만 있으면 모든 노드를 참조할 수 있기 때문에 구현이 간단합니다. 이 외에도 트리를 표현하는 방법으로 이진 트리(Binary Tree)가 있는데, 다음 시간에 알아 보도록 하겠습니다. 노드 생성 function LCRSNode(data) { this.data = data; this.leftChild = null; this.rightSibling = null; } const ..
알고리즘의 성능을 평가하는 복잡도
알고리즘의 성능을 평가하는 복잡도
2021.10.23알고리즘 성능 평가 척도 📐 알고리즘 성능을 나타내는 척도는 일반적으로 복잡도(Complexity)라는 것을 사용합니다. 복잡도는 시간 복잡도(Time Complexity)와 공간 복잡도(Space Complexity)로 나눌 수 있으며, 각각 프로그램 실행 시간이 얼마나 걸리는지와 메모리 공간을 얼마나 사용하는지에 연관이 있습니다. 동일한 기능을 수행하는 알고리즘은 복잡도가 낮은 것이 더 좋습니다만, 일반적으로 시간 복잡도와 공간 복잡도는 서로 트레이드오프(Trade-off) 관계를 가집니다. 그래서 코딩 테스트와 같은 환경에서는 메모리를 좀 더 사용하면서 수행 시간을 줄이는 식으로 문제를 해결하곤 합니다. 시간 복잡도 문제를 해결할 때 복잡도가 몇인지 물어보면 대개 시간 복잡도를 의미합니다. 시간 복..
큐 (Queue)
큐 (Queue)
2021.10.14Queue 🙂 큐(Queue)는 스택과 함께 대표적인 자료구조입니다. 스택이 Last In, First Out(LIFO)의 구조를 띄고 있었다면, 큐는 First In, Fist Out(FIFO)라는 선입선출 구조를 띄고 있습니다. 그리고 큐 역시 각 동작마다 명칭이 정해져 있는데, 큐의 마지막에 새로운 데이터를 추가하는 작업을 인큐(Enqueue), 그리고 맨 앞의 데이터를 빼는 작업을 디큐(Dequeue)라 합니다. 큐를 구현할 때는 디큐(Dequeue)가 일어날 때마다, 맨 앞을 가리키는 front의 값이 하나씩 뒤로 이동하는 것을 유의해야 합니다. 자바스크립트에서는 배열 프로토타입의 메소드 중 push와 shift로 큐를 간단하게 구현할 수 있지만, 본문의 코드에서는 사용하지 않았습니다. 큐 프로..
스택 (Stack)
스택 (Stack)
2021.10.14Stack 🙂 스택(Stack)은 맨 처음 들어간 것이 가장 마지막에 나오는 자료구조를 말합니다. 이러한 구조를 Last In, First Out(LIFO) 또는 First In, Last Out(FILO) 구조라 부릅니다. 스택은 다음에 다뤄 볼 큐(Queue)와 함께 소프트웨어 분야에서 정말 중요한 구조입니다. 프로그램들이 이용하는 자동 메모리 영역도 스택 구조로 되어 있고, 대부분의 네트워크 프로토콜도 스택을 기반으로 구성되어 있습니다. 링크드 리스트를 만들 때는 노드를 추가하고 제거하는 과정에 별다른 이름이 없었지만, 스택과 큐는 명칭들이 정해져 있습니다. 데이터를 스택에 추가하는 작업을 push라 하며, 데이터를 제거하는 작업을 pop이라 합니다. 기본적으로 스택은 배열 또는 링크드 리스트를 이..
원형 링크드 리스트 (Circular Linked List)
원형 링크드 리스트 (Circular Linked List)
2021.10.13Circular Linked List 🙂 원형 링크드 리스트(Circular Linked List)는 처음 노드와 마지막 노드를 연결했다는 점에서 더블 링크드 리스트와 차이가 있습니다. 그렇기 때문에 마지막 노드를 제거할 때는 첫 노드의 이전 노드를 참조해서 제거하면 되므로 상대적으로 속도가 빠릅니다. 물론 이 경우에 한해서만 그렇고, 나머지는 다른 링크드 리스트들과 동일한 성능을 보입니다. 노드 & 리스트 생성 function Node(data) { this.data = data; this.prev = null; this.next = null; } function LinkedList() { this.head = null; this.length = 0; } 원형 링크드 리스트의 노드와 리스트는 더블 링크..
더블 링크드 리스트 (Doubly Linked List)
더블 링크드 리스트 (Doubly Linked List)
2021.10.13Doubly Linked List 🙂 더블 링크드 리스트(Doubly Linked List)는 기존의 링크드 리스트가 한 방향(Tail 방향)으로만 탐색 가능하던 것을 보완하기 위해 만들어진 자료구조입니다. 더블 링크드 리스트의 노드는 next 외에도 prev라는 것을 멤버 변수로 갖고 있는데, 이 변수의 값을 통해 바로 이전의 노드를 참조할 수 있습니다. 그렇다 해도 결국 리스트 내에 있는 head를 통해 하나씩 순차적으로 접근해야 하기 때문에, 단일 링크드 리스트와 특별하게 다른 부분은 없습니다. 노드 & 리스트 생성 class Node { constructor(data) { this.data = data; this.prev = null; this.next = null; } } class Linked..
서로 다른 조직이 연계하여 협력하는 문화. DevOps
서로 다른 조직이 연계하여 협력하는 문화. DevOps
2021.10.11DevOps란 무엇일까? 🤔 애자일(Agile)한 방식으로 협업한다면, 소프트웨어 개발의 생산성과 효율성을 높일 수 있습니다. 그렇기 때문에 많은 기업들이 애자일한 조직 문화를 정착시키기를 원했고, 전환을 시도했습니다. 결과적으로 애자일 프로세스에 의해 소프트웨어 개발 속도가 빨라지고, 사용자에게 빠르게 제공할 수 있게 되었습니다. 하지만 소프트웨어 개발 속도가 빨라지고, 배포가 잦아지는 과정 속에서 애자일이 커버하지 못하는 부분들이 생기기 시작했습니다. 하나의 소프트웨어를 여러 팀(개발, 운영, 보안과 같은)이 다루기 때문에, 이 안에서 간극이 발생한 것이 대표적입니다. 사용자의 요구 사항에 맞춰 빠르게 새로운 변화를 적용하고 시도하는 개발팀과, 장애 없이 안정적인 운영을 원하는 운영팀의 입장은 너무나..
애자일 방법론과 스크럼, 칸반
애자일 방법론과 스크럼, 칸반
2021.10.11애자일 개발 방법론 🤗 애자일 방법론(Agile Methodology)은 어떻게 보면 폭포수 모델보다 우리에게 더 익숙한 용어일 수 있습니다. 현재 많은 회사에서 조직 문화를 애자일하게 전환해 나가고 있으며, 이를 더 잘 활용하기 위해 깊이 연구하고 있습니다. 애자일도 폭포수 모델과 동일하게 소프트웨어 개발 생명 주기를 어떻게 활용할지를 고민하여, 프로젝트를 더 효율적으로 진행해서 높은 품질의 소프트웨어를 개발하기 위해 등장했습니다. 애자일(Agile)의 사전적 의미는 날렵한, 민첩한, 재빠른입니다. 그 의미에 맞게 정해진 계획만 따르기보다는 개발 생명 주기 또는 개발 환경에 따라 그때그때 유연하게 대처해나가는 소프트웨어 개발 방법론입니다. 위 그림처럼 애자일 방법론은 폭포수 모델과 동일하게 소프트웨어 ..
폭포수 모델 (Waterfall)
폭포수 모델 (Waterfall)
2021.10.11선형 순차적 모델 🤔 선형 순차적(Linear Sequential) 모델은 폭포수 모델이라는 이름으로 잘 알려져 있습니다. 이 모델은 이름이 의미하는 것처럼 폭포에서 물이 떨어지듯이 다음 단계로 넘어가면서 진행하는 프로세스입니다. 폭포수 모델은 정말 고전적인 생명 주기 프로세스이며, 각 단계가 하향식(Top-Down)으로 진행되면서, 넘어간 단계는 절대 거슬러 올라갈 수 없습니다. 그렇기 때문에 각 단계마다 만들어진 산출물에 대해 확인하는 과정을 갖습니다. 폭포수 모델의 장단점 💦 폭포수 모델은 각 단계가 완료되면 더 이상 돌아갈 수 없기 때문에, 단계마다 상세한 문서를 잘 남기게 되는 문서 중심의 모델입니다. 각 단계에서 만들어진 산출물은 다음 단계의 입력 자료로 사용되어 해당 단계의 자료를 만들 때 ..
소프트웨어 공학이 필요한 이유
소프트웨어 공학이 필요한 이유
2021.10.10소프트웨어 공학 🤔 더 좋은, 더 나은 품질의 소프트웨어를 만들기 위해서는 소프트웨어 공학을 공부해야 한다고 합니다. 대체 소프트웨어 공학은 무엇이고, 왜 공부하면 좋다고 말하는 걸까요? 단순히 프로그래밍만 잘 해도 되는 건 아닌걸까요? 이에 대한 의문을 해소하기에 앞서, 우리는 소프트웨어를 개발하는 환경을 생각해 봐야 합니다. 오늘날의 소프트웨어는 대부분 개인이 아닌 팀 단위로 개발됩니다. 그렇기 때문에 소프트웨어를 필요로 하는 고객도 있을테고, 다양한 팀원들도 있을 것입니다. 이렇게 규모가 있는 프로젝트를 진행하기 위해서 우리는 구현을 위한 기술력도 갖춰야 하고, 고품질을 위한 테스트도 해야 하며, 의사소통 또한 원활하게 할 수 있어야 합니다. 하지만 이를 위한 체계적인 프로세스가 없다면, 우리는 프..
단일 링크드 리스트 (Singly Linked List)
단일 링크드 리스트 (Singly Linked List)
2021.10.10Singly Linked List 🙂 많은 데이터를 담기 위해서는 배열(Array)을 사용합니다. 그런데 배열은 간단하지만, 데이터를 담을 수 있는 사이즈에 제약이 있습니다. 자바스크립트에서의 배열은 메모리가 허용하는 한 사이즈가 무한하지만, C나 Java 같은 언어에서는 배열을 만들 때 정적으로 초기 사이즈를 결정한 후 사용해야 합니다. 그렇기 때문에 사이즈를 넘어서는 만큼의 데이터는 넣을 수 없다는 문제가 있습니다. 그래서 고안된 것이 링크드 리스트(Linked List)라 하는 선형(Linear) 자료구조입니다. 각 요소는 노드라는 것으로 표현하고, 노드들을 하나하나 연결해 놓은 것이 바로 링크드 리스트입니다. 요소를 추가할 때마다 새로운 노드를 만들어 연결하면 되기 때문에, 사이즈를 걱정할 필요가..