Computer Sci.

최근에 Typescript로 BST를 직접 구현해 보라는 질문을 받았는데 제대로 구현하지 못했다. 그래서 중요한 개념을 복습할 겸 하나씩 정리해 보고자 한다. with Codex이 글은 정수 값만 저장하는 Binary Search Tree(BST) 를 TreeNode, BinarySearchTree 두 클래스로 직접 구현하는 흐름을 정리한 노트입니다. 먼저 의사코드로 생각을 고정하고, 그 다음 그림으로 포인터 이동을 확인한 뒤, 마지막에 TypeScript 코드로 옮깁니다.이 구현의 규칙은 네 가지입니다.value는 정수만 허용합니다.한 노드의 왼쪽 서브트리에는 더 작은 값만 둡니다.한 노드의 오른쪽 서브트리에는 더 큰 값만 둡니다.중복 값은 삽입하지 않고 false를 반환합니다.1. BST 규칙부터 잡..
이 문제를 풀기 위해서는 비트마스크 DP에 대해서 알아야 한다.배열의 길이가 최대 16이기 때문에, 각 원소를 썼는지 안 썼는지를 하나의 비트마스크로 표현할 수 있다. 그리고 어떤 원소들을 이미 사용했는지 알 수 있으면, 지금 만들고 있는 부분집합의 합이 목표값에서 어디까지 차 있는지도 계산할 수 있다.0. 필요한 개념 먼저 정리하기먼저 이 문제의 목표는 k개의 부분집합을 만드는 것이다. 모든 부분집합의 합이 같아야 하므로, 전체 합을 k로 나눈 값이 각 부분집합의 목표 합이 된다.예를 들어 nums = [4,3,2,3,5,2,1], k = 4라면 전체 합은 20이고 각 부분집합의 목표 합은 5다. 따라서 (5), (4,1), (3,2), (3,2)처럼 모든 그룹이 합 5로 끝나야 한다.여기서 중요한 전..
이 문제를 풀기 위해서는 비트마스크 DP에 대해서 알아야 한다.비트마스크는 여러 개의 참/거짓 상태를 하나의 정수로 압축하는 방법이다. 이 문제에서는 필요한 스킬의 개수가 최대 16개이므로, 각 스킬을 비트 하나에 대응시키면 어떤 팀이 가진 스킬 조합을 숫자 하나로 표현할 수 있다. 그리고 그 숫자를 DP의 상태로 쓰면, "이 스킬 조합을 만들 수 있는 가장 작은 팀"을 차근차근 갱신할 수 있다.0. 필요한 개념 먼저 정리하기먼저 비트마스크부터 보자. 예를 들어 필요한 스킬이 ["java", "nodejs", "reactjs"]라면 다음처럼 위치를 정할 수 있다.java -> 0번 비트nodejs -> 1번 비트reactjs -> 2번 비트그러면 ["nodejs", "reactjs"]를 가진 사람은 11..
이 문제를 풀기 위해서는 이분 그래프 최대 매칭(Bipartite Matching), 그중에서도 Kuhn Algorithm에 대해서 알아야 한다.Kuhn Algorithm은 이분 그래프에서 매칭의 수를 하나씩 늘려 가는 알고리즘이다. 핵심은 단순히 "빈 자리를 찾는다"가 아니라, 이미 누군가 차지한 자리라도 기존 매칭을 다른 곳으로 옮길 수 있다면 전체 매칭 수를 늘릴 수 있다는 점이다.이 문제에서 남학생과 여학생은 자연스럽게 두 그룹으로 나뉜다.왼쪽 그룹: 남학생오른쪽 그룹: 여학생grid[i][j] === 1: i번 남학생이 j번 여학생을 초대할 수 있음따라서 문제는 "가능한 초대 관계들 중 서로 겹치지 않게 최대 몇 쌍을 만들 수 있는가?"로 바뀐다.1. 접근 : 문제를 단순화 하기문제에서는 m x..
이 문제를 풀기 위해서는 MST(Minimum Spanning Tree, 최소 신장 트리)에 대해서 알아야 한다.Spanning Tree(신장 트리)는 그래프 내의 모든 정점을 포함하는 트리이다.스패닝 트리는 사이클을 만들면 안 되고 n개의 노드를 (n-1)개의 간선으로 연결한다.그리고 이 스패닝 트리를 연결하는 간선에 가중치(strength)가 있을 때 그 가중치의 값을 최소로 구하는 경우가 바로 MST이다.1. 접근 : 문제를 단순화 하기이 문제에서는 노드가 n개 주어지고 각각의 간선이 edges[i]로 주어진다고 했다. edges[i] = [u, v, s, must] 인데 u - v 이어지는 무방향 간선이며 여기에 가중치가 s, 그리고 must가 1이면 필수, 0이면 한 번까지 업그레이드가 가능하다..
AI 도구의 발전 속도는 매우 빠르다. 매주 새로운 AI 도구들이 생겨나고 있고, 클로드(Claude) 같은 에이전트는 하루에도 여러 차례 업데이트된다. 이런 변화 속에서 많은 현업 개발자들이 따라가기에 벅차다고 느낀다. 모두가 AI를 이야기하니 뒤처질 것 같은 FOMO를 느끼기도 하고, AI가 마법처럼 모든 일을 해결해줄 것이라 기대했다가 오히려 불필요한 작업이 늘어나는 경험을 한 사람도 있을 것이다.필자는 현업 개발자로서 급변하는 트렌드를 맹목적으로 좇기보다, 본질적인 원리를 깊게 이해하는 데 집중하려 한다. 이 글에서는 AI 에이전트를 실무에서 어떻게 활용할 수 있는지, 필자의 경험을 바탕으로 스킬(Skill), 규칙(Rules), 커맨드(Commands), 서브 에이전트(Sub-Agents)의 차..
원문: Lessons From 9 More Years of Tricky Bugs2002년부터 저는 제가 마주친 모든 까다로운 버그를 추적해왔습니다. 9년 전, 그때까지의 버그에서 얻은 교훈을 담아 블로그 글을 작성했습니다. 그 이후로 기록해온 버그들을 이번에 전부 다시 돌아봤습니다. 첫 번째 회고에서 정리했던 교훈들을 실제로 잘 실천해왔는지 확인하고 싶었고, 그사이 어떤 유형의 버그들을 마주쳤는지도 살펴보고 싶었습니다. 이전과 마찬가지로 교훈을 코딩, 테스팅, 디버깅의 카테고리로 나눠 정리했습니다.코딩1. 빈 케이스. 다섯 개의 버그가 빈 줄, 빈 파일, 공백, 또는 값이 0인 경우와 관련이 있었습니다. 예를 들어, 공백 한 칸(0이 아닌)이 있는 줄은 비어있는 것으로 건너뛰어야 했지만 그렇지 않았습니다..
4.1 데드락 식사하는 철학자 문제(dining philosophers problem)는 데드락을 설명하는 유명한 예제이다. 여기서 설명하는 데드락의 원리는 다음과 같다. 왼쪽 포크가 비기를 기다렸다가 왼쪽 포크를 사용할 수 있는 상태가 되면 포크를 든다. 오른쪽 포크가 비기를 기다렸다가 오른쪽 포크를 사용할 수 있는 상태가 되면 포크를 든다. 식사를 한다. 포크를 테이블에 놓는다. 단계 1로 돌아간다. 데드락(deadlock) : 서로 자원(포크)이 비는 것을 기다리며 더 이상 처리가 진행되지 않는 상태 철학자 2명일 때 데드락 동시에 2명의 철학자가 왼쪽 포크를 들어 올린 뒤 오른쪽 포크를 계속 기다리게 되므로 더이상 처리가 진행 X 식사하는 철학자 문제는 스테이트 머신(state machine)에서..
DevOwen
'Computer Sci.' 카테고리의 글 목록