이 문제를 풀기 위해서는 후위 순회(postorder traversal)와 트리 DP에 대해서 알아야 한다.각 노드에서 자식들이 만들어 둔 최적의 값을 받아 현재 노드의 값을 계산한다. 다만 이 문제에서는 부모에게 넘길 값과 전체 정답 후보가 서로 다르다는 점이 핵심이다.0. 필요한 개념 먼저 정리하기0-1. 경로와 후위 순회트리의 경로는 인접한 노드를 간선으로 이어 만든 노드의 나열이다. 같은 노드를 두 번 지날 수 없고, 루트를 반드시 포함할 필요도 없다. 따라서 어떤 노드에서 왼쪽 자식으로 내려갔다가 다시 그 노드를 거쳐 오른쪽 자식으로 내려가는 형태도 하나의 유효한 경로다.현재 노드에서 최선의 값을 계산하려면 왼쪽과 오른쪽 서브트리의 결과가 먼저 필요하다. 자식을 먼저 처리하고 부모를 나중에 처리..
전체 글
안녕하세요. 사진과 철학에 관심이 많은 웹 프론트엔드 개발자 오원종입니다. 시간이 지나도 꾸준히 읽힐 수 있는 글을 쓰고 싶습니다. 재미있는 일만 하면서 살고 있는 사람입니다.원문: https://jakearchibald.com/2025/present-and-future-of-progressive-image-rendering/프로그레시브 이미지 포맷을 쓰면 이미지 리소스의 일부만 받은 상태에서도 디코더가 부분 렌더링을 만들어낼 수 있습니다. 이미지의 일부만 표시되기도 하고, 저품질·저해상도 버전으로 표시되기도 합니다. 최근 이 주제를 깊이 파고들다가 흔한 오해 몇 가지를 발견했고, AVIF에서 좀 더 실용적인 해결책이 나오면 좋겠다는 생각을 하게 됐습니다.지금 브라우저가 기본으로 지원하는 프로그레시브 렌더링이 어떤 것들인지부터 살펴보겠습니다.브라우저의 프로그레시브 이미지 렌더링 현황비교에 쓸 이미지를 소개합니다. 이 글을 다 읽을 때쯤이면 이 이미지가 눈에 아른거릴 겁니다.해..
원문: https://jakearchibald.com/2025/fetch-streams-not-for-progress/Mozilla에서 제 역할 중 하나는 우리가 올바른 기능에 집중하고 있는지 확인하는 것인데, 이번에는 fetch 업로드 스트림 주제를 다루게 됐습니다. Chrome이 한동안 지원해 온 기능이지만, Firefox나 Safari에서는 아직 지원되지 않습니다.저는 다양한 소셜 플랫폼에서 이 기능을 어떻게 생각하는지, 무엇에 활용할 것인지를 물어봤습니다. 단연 가장 많은 답변은 "업로드 진행 상황을 측정하기 위해"였습니다. 하지만 그 목적으로 쓰면 부정확한 결과가 나오고, 심지어 브라우저에서 잘못된 구현으로 이어질 수도 있습니다.자세히 살펴보겠습니다…응답 스트림스트리밍 응답은 수년 전부터 모든 ..
26.07.27 ~ 26.07.31AI Agent를 만드는 업무를 시작했다7월에 조직 개편이 되면서 팀 내에서 사용할 AI Agent를 만드는 업무를 새롭게 하게 될 예정이다. 지금까지 내가 해 왔던 익숙했던 작업들과 다른 작업들이라 조금 걱정되기도 하고 잘 할 수 있을까 두렵지만, 그래도 도전적인 업무를 하면서 내가 성장할 수 있을 것 같아서 만족스럽다. 여러 서드파티 연동을 해야 하는 서비스이고, 인증 절차도 까다로워서 이러한 부분에서 고민의 영역이 많지만, 잘 정리하면 나한테 의미가 있는 프로젝트가 될 것 같아서 기쁘다. 자세하게 말할 수는 없지만, 팀 안에서 매번 사람이 수동으로 해야 하는 여러 길고 복잡한 작업들을 AI가 알아서 다 하게 만들어 주는 슬랙 봇을 만들게 되었다. 이틀 만에 초안을 ..
최근에 Typescript로 BST를 직접 구현해 보라는 질문을 받았는데 제대로 구현하지 못했다. 그래서 중요한 개념을 복습할 겸 하나씩 정리해 보고자 한다. with Codex이 글은 정수 값만 저장하는 Binary Search Tree(BST) 를 TreeNode, BinarySearchTree 두 클래스로 직접 구현하는 흐름을 정리한 노트입니다. 먼저 의사코드로 생각을 고정하고, 그 다음 그림으로 포인터 이동을 확인한 뒤, 마지막에 TypeScript 코드로 옮깁니다.이 구현의 규칙은 네 가지입니다.value는 정수만 허용합니다.한 노드의 왼쪽 서브트리에는 더 작은 값만 둡니다.한 노드의 오른쪽 서브트리에는 더 큰 값만 둡니다.중복 값은 삽입하지 않고 false를 반환합니다.1. BST 규칙부터 잡..
26.07.06 ~ 26.07.10나의 필요에 의한 스킬을 처음 만들어 보았다나는 지금까지 누군가가 만든 스킬을 사용하는 것에 익숙했는데, 최근에 처음으로 내가 필요에 의해서 반복되는 작업을 스킬로 만든 사례가 있었다.나는 뱅크샐러드에서 가계부 관리를 한다. 뱅크샐러드와 내 모든 은행과, 카드를 연동하면 실시간으로 나의 자산 내역과 지출, 수입 내역을 관리할 수 있어서 편리하게 잘 쓰고 있다. 뱅크샐러드에서 이 모든 자산 관련 내용을 엑셀 파일로 추출할 수 있는데, 한 달에 한 번씩 내가 수동으로 하고 있던 재무관리를 AI 스킬을 만들어서 하게 해 보았다.뱅크 샐러드 앱에서 파일 추출 후 Codex에 파일 업로드까지만 내가 하고 내가 만든 재무분석 스킬을 돌리면 AI가 알아서,나의 현재 자산 현황 (현금..
이 문제를 풀기 위해서는 비트마스크 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..
