문제 개요이진 트리가 주어졌을 때, 트리의 각 레벨(행)마다 가장 큰 값을 찾아야 합니다. 예를 들어 아래와 같은 이진 트리가 있다고 가정해 보겠습니다.루트부터 마지막 레벨까지 순서대로 각 행의 최댓값만 모으면 결과 배열을 얻을 수 있습니다.접근 방법 (DFS 재귀 활용)이 문제는 깊이 우선 탐색(DFS)과 재귀 함수를 이용하면 간단하게 해결할 수 있습니다. 핵심 아이디어는 노드가 속한 레벨 번호를 추적하면서, 해당 레벨을 처음 방문했는지 여부에 따라 처리 방식을 나누는 것입니다.결과를 저장할 배열 ans를 선언합니다.트리 노드와
정수 배열이 하나 주어져 있다고 가정해 보겠습니다. 배열의 모든 원소는 중복 없이 고유한 값입니다. 이 배열을 바탕으로 만들어지는 최대 트리(Maximum Tree)는 다음과 같은 규칙에 따라 정의됩니다. 루트(root)에는 배열에서 가장 큰 값이 위치합니다. 왼쪽 서브트리는 최댓값을 기준으로 나뉜 왼쪽 부분 배열로부터 만들어진 최대 트리입니다. 오른쪽 서브트리는 최댓값을 기준으로 나뉜 오른쪽 부분 배열로부터 만들어진 최대 트리입니다. 즉, 주어진 배열로 최대 이진 트리(maximum binary tree)를 구성해야 합니다.
이진 트리가 하나 주어졌을 때, 해당 트리의 최대 너비(maximum width)를 구하는 함수를 정의해야 합니다. 여기서 트리의 너비란 모든 레벨(층) 중에서 가장 넓은 레벨의 너비를 의미합니다. 이 문제에서 이진 트리는 완전 이진 트리와 동일한 구조를 기준으로 하되, 일부 노드가 null일 수 있다고 가정합니다. 한 레벨의 너비는 그 레벨의 양 끝 노드, 즉 가장 왼쪽에 있는 null이 아닌 노드와 가장 오른쪽에 있는 null이 아닌 노드 사이의 길이로 정의되며, 두 끝 노드 사이에 존재하는 null 노드들도 길이 계산에 포함
문제 개요 이진 트리의 루트(root) 노드가 주어지고, 트리를 구성하는 모든 노드의 값은 0 또는 1이라고 가정해 봅시다. 우리가 구해야 하는 것은 값이 1인 노드를 하나도 포함하지 않는 서브트리(subtree)를 모두 잘라낸(pruning) 결과 트리입니다. 예를 들어 트리가 다음과 같다고 하면 − 해결 접근 방법 이 문제는 후위 순회(post-order traversal) 기반의 재귀 함수를 사용하면 깔끔하게 해결할 수 있습니다. 자식 노드를 먼저 처리한 뒤 부모 노드를 판단해야, 리프 노드부터 차례대로 불필요한
문제 정의정수 배열 A로 표현되는 원형 배열(circular array) C가 주어졌다고 가정해 보겠습니다. 목표는 C에서 비어 있지 않은 부분배열(subarray) 중 합이 최대가 되는 값을 찾는 것입니다. 단, 하나의 부분배열은 고정 버퍼 A의 각 원소를 최대 한 번만 포함할 수 있습니다.예를 들어 배열이 [1, -2, 3, -2]라면 결과는 3입니다. 부분배열 [3]의 합이 3으로 가장 크기 때문입니다.풀이 전략원형 배열에서 최대 합 부분배열은 다음 두 가지 경우 중 하나에 해당합니다.경계를 넘지 않는 경우 — 일반적인 선형
서로 다른 값들로 구성된 두 개의 시퀀스 pushed와 popped가 주어졌을 때, 이 두 시퀀스가 처음에 비어 있던 스택에 대해 push와 pop 연산을 수행한 결과로 나타날 수 있는지 판별하는 문제입니다.예를 들어 push = [1,2,3,4,5], pop = [4,5,3,2,1]이 입력으로 주어지면 출력은 true가 됩니다. 실제 연산 순서는 다음과 같습니다.push(1) → push(2) → push(3) → push(4) → pop() : 4 → push(5) → pop() : 5 → pop() : 3 → pop() : 2
문제 개요이진 트리(binary tree)에서 뒤집기(flip) 연산이란 임의의 노드 하나를 선택하여 해당 노드의 왼쪽 자식 서브트리와 오른쪽 자식 서브트리를 서로 교환하는 것을 의미합니다.두 이진 트리 X와 Y가 플립 등가(flip equivalent) 관계라는 것은, X에 대해 여러 번의 뒤집기 연산을 수행하여 Y를 만들어낼 수 있을 때, 그리고 오직 그 경우에만 성립합니다.이번 글에서는 두 이진 트리가 서로 플립 등가인지 판별하는 메서드를 작성해 보겠습니다. 트리는 각각 루트 노드 root1과 root2로 주어집니다.예시다음과
이진 트리가 주어졌을 때, 해당 트리가 완전 이진 트리(Complete Binary Tree)인지 판별하는 문제를 살펴보겠습니다.완전 이진 트리란 깊이가 n인 트리에서 레벨 0부터 n-1까지는 모든 노드가 가득 차 있고, 가장 아래 레벨 n의 노드들은 반드시 왼쪽부터 순서대로 채워져야 하는 트리를 의미합니다.예를 들어 다음과 같은 트리가 입력으로 주어지면,모든 노드가 위 조건을 만족하므로 출력은 true가 됩니다.문제 해결 접근 방법이 문제는 BFS(너비 우선 탐색)와 플래그 변수를 활용하면 효율적으로 해결할 수 있습니다. 핵심 아
팬케이크 정렬이란?팬케이크 정렬(Pancake Sort)은 뒤집개로 팬케이크를 뒤집는 모습에서 착안한 정렬 알고리즘입니다. 배열 A가 주어졌을 때 이 기법으로 A를 정렬하는데, 핵심 제약 조건은 rev(arr, i)라는 단 하나의 연산만 사용할 수 있다는 점입니다. 이 연산은 배열 arr의 0번째 인덱스부터 i번째 인덱스까지의 원소들을 한꺼번에 뒤집습니다.전체적인 아이디어는 선택 정렬(selection sort)과 유사합니다. 즉, 가장 큰 원소를 반복적으로 배열의 끝에 배치하면서 정렬 대상 범위를 하나씩 줄여 나가는 방식입니다.
이진 트리의 루트 노드가 주어졌을 때, 트리에는 총 N개의 노드와 N개의 코인이 존재합니다. 각 노드는 node.val만큼의 코인을 가지고 있으며, 모든 노드에 정확히 하나씩의 코인이 배분되도록 만들어야 합니다.한 번의 이동(move)으로 인접한 두 노드 사이에서 단 하나의 코인을 옮길 수 있습니다. 이동 방향은 부모 노드에서 자식 노드로, 또는 자식 노드에서 부모 노드로 어느 쪽이든 가능합니다. 우리가 구해야 하는 것은 모든 노드에 코인이 하나씩 배치되도록 하는 데 필요한 최소 이동 횟수입니다.문제 예시예를 들어 다음과 같은 트리
기차 여행으로 유명한 나라가 있다고 가정해 보겠습니다. 우리는 1년 전부터 기차 여행 계획을 세워 왔으며, 올해 여행할 날짜들이 담긴 배열을 가지고 있습니다. 각 날짜는 1부터 365 사이의 정수로 표현됩니다.기차표는 다음과 같은 세 가지 방식으로 판매됩니다.1일권: costs[0]달러7일권: costs[1]달러30일권: costs[2]달러각 패스는 해당 일수만큼 연속적으로 여행할 수 있는 권리를 제공합니다. 예를 들어, 2일째에 7일권을 구매하면 2일부터 8일까지(2, 3, 4, 5, 6, 7, 8일) 쉬지 않고 여행할 수 있습니
최대 트리(Maximum Tree)는 모든 노드의 값이 자신의 서브트리에 포함된 다른 어떤 값보다 항상 큰 특수한 이진 트리입니다. 리스트 A가 주어졌을 때 이를 기반으로 루트 노드를 생성하는 construct() 메서드가 있다고 가정해 보겠습니다. construct() 메서드는 다음과 같이 동작합니다.리스트 A가 비어 있으면 null을 반환합니다.A[i]가 리스트 A에서 가장 큰 원소라면, 그 값을 가지는 루트 노드를 생성합니다.루트의 왼쪽 자식은 construct([A[0], A[1], ..., A[i-1]])의 결과가 됩니다.
문제 이해하기문자열 abc가 유효(valid)하다고 가정해 봅시다. 임의의 유효한 문자열 V를 두 조각 X와 Y로 나눌 수 있고(X 또는 Y는 비어 있어도 됨), X + Y가 V와 같다면 X + abc + Y 역시 유효한 문자열이 됩니다.예를 들어 유효한 문자열에는 abc, aabcbc, abcabc, abcabcababcc 등이 있으며, 유효하지 않은 문자열에는 abccba, ab, cababc, bac 등이 있습니다. 우리가 할 일은 주어진 문자열 S가 유효한지 여부를 판별하는 것입니다.예를 들어 입력이 abcabcababcc라
문제 개요이진 트리의 루트(root)가 주어졌을 때, 서로 다른 두 노드 A와 B에 대해 V = |A의 값 − B의 값|을 만족하고 A가 B의 조상(ancestor)인 경우의 최댓값 V를 구하는 것이 목표입니다.예를 들어 아래와 같은 트리가 있다고 가정해 보겠습니다.이 트리에서 조상 노드와 자손 노드 간의 차이는 [(8 − 3), (7 − 3), (8 − 1), (10 − 13)]이 되며, 그중 (8 − 1) = 7이 가장 큰 값입니다. 따라서 출력 결과는 7입니다.접근 방법이 문제는 DFS(깊이 우선 탐색)를 활용한 재귀적 접근으
문제 개요서로 다른 정수 값으로 구성된 이진 검색 트리(Binary Search Tree, BST)의 루트 노드가 주어집니다. 이 트리를 더 큰 합 트리(Greater Sum Tree)로 변환하는 것이 목표입니다. 즉, 모든 노드의 새로운 값은 원래 트리에서 그 노드의 값보다 크거나 같은 모든 노드 값의 합이 되어야 하며, 변환 후에도 BST의 기본 성질(왼쪽 자식 < 부모 < 오른쪽 자식)은 그대로 유지되어야 합니다.예를 들어 입력 트리가 다음과 같다면 −변환된 출력 트리는 다음과 같습니다 −값이 4인 루트 노드를 예로
문제 소개 N×N 크기의 정사각형 격자(grid)가 주어지며, 각 칸은 비어 있는 경우(0)와 막혀 있는 경우(1)로 나뉩니다. 왼쪽 위에서 오른쪽 아래로 이어지는 명확한 경로(clear path)는 길이가 k일 때 다음 조건을 만족하는 셀 C1, C2, ..., Ck로 정의됩니다. 인접한 두 셀 Ci와 Ci+1은 8방향으로 연결되어 있어야 합니다. 즉, 서로 다른 셀이면서 변 또는 모서리를 공유합니다. C1은 위치 (0, 0)에 있어야 합니다. Ck는 위치 (N-1, N-1)에 있어야 합니다. Ci가 (r, c)에 위치할 때,
문제 개요여는 괄호 ( , 닫는 괄호 ) 그리고 영어 소문자로 이루어진 문자열 s가 있다고 가정해 봅시다. 우리는 문자열에서 최소 개수의 괄호를 제거하여 결과 문자열이 유효한(valid) 괄호 문자열이 되도록 만들어야 하며, 가능한 유효한 문자열 중 하나를 반환하면 됩니다.괄호 문자열이 유효하려면 다음 조건 중 하나를 만족해야 합니다.빈 문자열이거나, 영어 소문자만으로 구성된 경우A와 B가 모두 유효한 문자열일 때, 두 문자열을 연결한 AB 형태로 표현할 수 있는 경우A가 유효한 문자열일 때, (A) 형태로 표현할 수 있는 경우예를
문제 소개 2차원 격자(grid)가 주어진다고 가정해 보겠습니다. 이 격자는 0(육지)과 1(물)로만 구성되어 있습니다. 여기서 섬(island)은 0들이 상하좌우 네 방향으로 연결되어 이루는 최대 그룹을 의미하고, 폐쇄된 섬(closed island)은 사방이 물(1)로 완전히 둘러싸여 있는 섬을 말합니다. 우리의 목표는 이러한 폐쇄된 섬의 개수를 구하는 것입니다. 예를 들어 다음과 같은 격자가 있다고 해봅시다. 1111111010000110101011101000010111111110 이 경우 출력값은 2입니다. 격자 내부에 물
문제 설명다음과 같은 규칙을 따르는 이진 트리가 있다고 가정해 봅시다.루트 노드의 값은 항상 root.val == 0 입니다.treeNode.val이 x이고 왼쪽 자식이 null이 아니라면, treeNode.left.val = 2 * x + 1 입니다.treeNode.val이 x이고 오른쪽 자식이 null이 아니라면, treeNode.right.val = 2 * x + 2 입니다.그런데 이 이진 트리가 오염(contaminated)되었다고 합시다. 즉, 트리의 모든 노드 값이 -1로 변경된 상태입니다. 우리는 먼저 이진 트리를 원래
검색 엔진이나 온라인 쇼핑몰에서 흔히 볼 수 있는 자동완성 기능은 사용자가 타이핑하는 즉시 관련 항목을 실시간으로 제안해 줍니다. 이번 글에서는 C++을 이용해 이러한 검색 제안(Search Suggestions) 시스템을 구현하는 방법을 문제 정의부터 코드 분석까지 단계별로 살펴보겠습니다. 문제 정의 문자열 배열 products와 문자열 searchWord가 주어집니다. 우리는 searchWord의 각 문자가 입력될 때마다 products 목록에서 최대 3개의 상품 이름을 제안하는 모듈을 설계해야 합니다. 제안되는 상품은 지금까