본문 바로가기

IT 공부104

코딩 주석 코딩을 할 때 주석을 달라는 말을 많이 듣는다. 주석이 있어야만 다른 사람이 코드를 이해할 수 있고, 미래의 나에게도 도움이 된다는 것이다. 물론 코드가 그 자체로서 요구사항을 충실히 반영하고 쉽게 읽혀진다면 주석이 필수는 아닐 것이다. 그러나 그렇다고 주석을 빼서는 안 된다고 한다. 즉, 주석은 처음부터 타인과의 소통과 협업을 위해 만들어진 도구다. 지금 혼자 독학하고 있는 나로서는 타인이 나의 코드를 바라보는 관점을 획득하기 힘든 환경이다. 마틴의 에서는 주석의 중요성을 강조한다. 그래서 한동안 주석 작성법을 열심히 배웠지만, 당연히 소용이 없었다. 왜냐하면 주석 다는 법은 술(術)의 영역이고, 주석의 도(道)는 타인이 코드를 어떻게 읽고 해석하는지 그 관점을 획득하는 것에 있기 때문이다. 당연히 술.. 2023. 11. 1.
분할 정복의 진정한 핵심은 정보 구축하기! (feat. 합병 정렬) 1. 합병 정렬(Merge Sort)이란? 정렬이란 임의의 데이터 배열을 일정한 규칙에 따라 배열하는 알고리즘을 말하며, 그 종류는 여러 가지가 있다. 기초 알고리즘 수업 시간에 다루는 정렬 알고리즘에는 "버블 정렬", "선택 정렬", "삽입 정렬", "합병 정렬", "퀵 정렬", ... 등이 있다. 이 중에서 버블과 선택, 그리고 삽입 정렬은 인간의 직관적인 정렬 방식을 그대로 프로그래밍 언어로 풀이한 것으로서, 사실상 컴퓨터 과학에서 다룰 가치가 전혀 없다. 데이터 개수(N)가 증가할수록 N의 제곱으로 처리량이 증가하기 때문이다. (여담이지만 직관적인 방식으로 알고리즘을 풀면 보통 쓸만한 알고리즘이 나오지 않는 것 같다.) 그러나 합병 정렬부터는 실질적으로 사용할 수 있다. 시간복잡도가 O(N log.. 2023. 10. 31.
그래프 알고리즘 구현과 간단한 순회 알고리즘 (javascript) class Graph { constructor() { this.adjacencyList = {}; }; /** * @param {string} vertex */ addVertex(vertex) { if ( this.hasThisVertex(vertex) ) return; this.adjacencyList[vertex] = []; }; removeVertex(vertex) { if (this.hasThisVertex(vertex)) { // 1) vertex 리스트 삭제 delete this.adjacencyList[vertex]; // 2) 이 vertext에 연결하고 있는 노드들의 리스트에서 원소 삭제 for (let key in this.adjacencyList) this.removeEdge(key,.. 2023. 10. 31.
알고리즘과 도메인 로직의 분리 (2023-10-30) 데이팅 앱에서 남녀간 매칭을 위해 사용하는 알고리즘 도구는 그래프. 그래프는 노드들 사이의 관계를 매핑하는데 사용된다. 범용 도구이며, 데이팅 앱과 같은 소프트웨어는 노드의 집합(남자와 여자)과 그 사이의 관계에 대한 제약을 통해 원하는 대로 그래프를 만들어 사용한다. 남자 집합의 노드와 여자 집합의 노드 사이의 연결을 최대한 많이 만드는 것이 핵심이며, 여기에 가중치가 고려된다. 이때 가중치 계산 방법은 알고리즘이라기보단, 도메인(domain) 로직에 가깝다. 남녀 사이의 좋은 매칭이 어떤지는 컴퓨터 과학자가 알 수는 없다. 컴퓨터 과학자는 다만 검증된 그래프 이론과 컴퓨팅 도구를 제공할 뿐이다. 알고리즘을 배운다고 해서 모든 도메인의 소프트웨어를 구현할 수 있는 것은 아니다. 알고리즘과는 별개로 도메.. 2023. 10. 31.