정렬된 연결 리스트(Linked List)가 주어졌을 때, 이를 이진 검색 트리(Binary Search Tree, BST)로 변환하는 문제를 살펴보겠습니다.문제 정의크기가 n인 정렬된 연결 리스트가 있다고 가정합니다. 다음 규칙에 따라 이진 검색 트리를 만들어야 합니다.k = floor(n / 2) 번째로 작은 값을 찾아 루트(root)로 설정합니다.k번째 노드보다 왼쪽에 있는 연결 리스트 부분으로 재귀적으로 왼쪽 서브트리를 구성합니다.k번째 노드보다 오른쪽에 있는 연결 리스트 부분으로 재귀적으로 오른쪽 서브트리를 구성합니다.예를
색상 문자열로 이루어진 목록이 있다고 가정해 보겠습니다. 이 목록에는 red, green, blue 세 가지 값만 포함되어 있으며, 우리는 이 목록을 빨강(red) → 초록(green) → 파랑(blue) 순서가 되도록 재배치해야 합니다.예를 들어 입력이 다음과 같다면,colors = [blue, green, blue, red, red]출력은 아래와 같아야 합니다.[red, red, green, blue, blue]해결 접근 방식이 문제는 널리 알려진 네덜란드 국기 문제(Dutch National Flag Problem)와 유사하며
문제 개요숫자로 이루어진 리스트 nums가 있다고 가정해 보겠습니다. 이 리스트에서 모든 값은 정확히 세 번씩 등장하지만, 오직 하나의 값만 한 번 나타납니다. 우리의 목표는 바로 이 고유한 값을 찾는 것이며, 추가 메모리 사용량이 입력 크기에 비례하지 않는 상수 공간(constant space) 조건에서 문제를 해결해야 합니다.예를 들어, 입력이 nums = [3, 3, 3, 8, 4, 4, 4]라면 숫자 3과 4는 각각 세 번 등장하고 8은 한 번만 등장하므로, 결과값은 8이 됩니다.해결 접근 방식이 문제는 다음 두 단계로 간단
숫자로 이루어진 리스트 nums가 주어졌을 때, 새로운 리스트를 만들어야 합니다. 새 리스트의 각 요소는 원본 리스트에서 해당 요소의 오른쪽에 위치한 더 작은 요소의 개수를 나타냅니다.예를 들어 입력이 nums = [4, 5, 9, 7, 2]라면 출력은 [1, 1, 2, 1, 0]이 됩니다. 그 이유는 다음과 같습니다.4의 오른쪽에는 더 작은 요소가 1개 있습니다 (2)5의 오른쪽에는 더 작은 요소가 1개 있습니다 (2)9의 오른쪽에는 더 작은 요소가 2개 있습니다 (7, 2)7의 오른쪽에는 더 작은 요소가 1개 있습니다 (2)2의
소문자로만 이루어진 두 문자열 S와 T가 주어졌을 때, 두 문자열에서 공통으로 만들 수 있는 가장 긴 아나그램(anagram) 부분 수열의 길이를 찾아야 합니다. 여기서 아나그램 부분 수열이란, 문자의 순서를 재배열했을 때 서로 동일해질 수 있는 부분 수열을 의미합니다.예를 들어 입력이 S = helloworld, T = hellorld라면 출력은 8이 됩니다.접근 방법핵심 아이디어는 간단합니다. 두 문자열에 공통으로 등장하는 각 문자에 대해, 더 적게 등장한 횟수만큼 부분 수열에 포함할 수 있다는 점입니다. 따라서 각 문자열의 문
정렬되지 않은 숫자 배열이 하나 주어졌다고 가정해 봅시다. 이때 우리는 연속된 요소들로 이루어진 가장 긴 시퀀스의 길이를 찾아야 합니다.예를 들어 입력이 nums = [70, 7, 50, 4, 6, 5]라면, 가장 긴 연속 시퀀스는 [4, 5, 6, 7]이고 그 길이는 4이므로 출력값은 4가 됩니다.문제 해결 접근 방법이 문제는 집합(Set) 자료구조를 활용하면 매우 효율적으로 해결할 수 있습니다. 핵심 아이디어는 각 숫자가 연속 시퀀스의 시작점인 경우에만 시퀀스의 길이를 계산하는 것입니다. 시작점 여부를 판단하는 기준은 간단합니다
숫자로 이루어진 리스트 nums가 주어졌을 때, 모든 요소가 서로 중복되지 않는(고유한) 가장 긴 연속 부분 리스트의 길이를 구하는 문제입니다.예를 들어 입력이 nums = [6, 2, 4, 6, 3, 4, 5, 2]라면 출력은 5가 됩니다. 고유한 요소로만 구성된 가장 긴 연속 구간이 [6, 3, 4, 5, 2]이고, 그 길이가 5이기 때문입니다.문제 해결 접근 방법이 문제는 슬라이딩 윈도우(Sliding Window) 기법과 해시 맵(딕셔너리)을 활용하면 효율적으로 해결할 수 있습니다. 각 요소가 마지막으로 등장한 인덱스를 딕셔
문제 개요숫자로 이루어진 리스트 nums와 정수 k가 주어진다고 가정해 봅시다. 여기서 연산이란 리스트 안의 임의의 한 요소를 1만큼 증가시키는 것을 의미합니다. 이 연산을 최대 k번까지 수행할 수 있을 때, 모든 요소가 동일한 값을 갖는 가장 긴 부분 리스트(연속된 구간)의 길이를 구하는 것이 목표입니다.예시입력이 다음과 같다고 해보겠습니다.nums = [3, 5, 9, 6, 10, 7], k = 6이 경우 출력은 3입니다. 그 이유는 9를 한 번, 6을 네 번 증가시켜 총 5번의 연산(k=6 이내)으로 [10, 10, 10]이라
이진 트리가 하나 주어졌다고 가정해 봅시다. 우리의 목표는 트리 안의 임의의 두 노드 사이에서 짝수 값으로만 구성된 가장 긴 경로를 찾는 것입니다.예를 들어 입력이 다음과 같다면,출력은 5가 됩니다. 이때 가장 긴 경로는 [10, 2, 4, 8, 6]입니다.문제 해결 접근 방법이 문제는 후위 순회(post-order traversal) 기반의 재귀 함수로 효율적으로 해결할 수 있습니다. 핵심 아이디어는 각 노드를 기준으로 왼쪽과 오른쪽 서브트리에서 뻗어 나갈 수 있는 짝수 경로의 길이를 계산하고, 현재 노드의 값이 짝수인지 여부에
문제 개요 숫자로 이루어진 리스트가 주어졌을 때, 그중에서 가장 길게 증가하는 부분 수열(Longest Increasing Subsequence, LIS)의 길이를 찾는 것이 목표입니다. 예를 들어 입력이 [6, 1, 7, 2, 8, 3, 4, 5]라면, 가장 긴 증가 부분 수열은 [2, 3, 4, 5, 6]이므로 정답은 5가 됩니다. 해결 접근 방식 단순한 동적 계획법(DP)으로도 풀 수 있지만, 여기서는 이진 탐색을 활용해 시간 복잡도 O(n log n)만에 해결하는 더 효율적인 방법을 소개합니다. 핵심 아이디어는 tails라
숫자 리스트 nums가 주어졌을 때, 인접한 두 숫자 사이의 대소 관계가 항상 작다(<)와 크다(>)로 번갈아 나타나는 가장 긴 부분 리스트(sublist)의 길이를 구하는 문제입니다. 첫 두 숫자의 부등호 방향은 작다 또는 크다 어느 쪽이든 상관없습니다.예를 들어 입력이 nums = [1, 2, 6, 4, 5]라면 출력은 4가 됩니다. 가장 긴 교차 부등식 부분 리스트가 [2, 6, 4, 5]이고, 이는 2 < 6 > 4 < 5를 만족하기 때문입니다.해결 접근 방법이 문제는 다음 단계에 따라 해결할 수
문자열 S가 주어졌을 때, 이 문자열에서 가장 긴 회문(palindrome) 부분 문자열의 길이를 구하는 문제입니다. 문자열 S의 최대 길이는 1000이라고 가정합니다. 예를 들어 문자열이 BABAC라면 가장 긴 회문 부분 문자열은 BAB이며, 그 길이는 3입니다.이 문제는 동적 계획법(Dynamic Programming)을 활용하면 효율적으로 해결할 수 있습니다. 핵심은 이미 계산한 짧은 부분 문자열의 회문 여부를 재활용하여, 점점 더 긴 부분 문자열을 검사하는 것입니다.알고리즘 접근 방법문자열 길이와 같은 크기의 정사각형 DP
숫자로 이루어진 리스트 nums가 주어졌을 때, 부분 리스트의 최솟값의 2배가 최댓값보다 커야 하는(2 × min > max) 조건을 만족하는 가장 긴 연속 부분 리스트(sublist)의 길이를 구하는 프로그램을 만들어 보겠습니다. 예를 들어 입력이 nums = [10, 2, 6, 6, 4, 4]라면 결과는 4입니다. 부분 리스트 [6, 6, 4, 4]가 이 조건(2 × 4 = 8 > 6)을 만족하는 가장 긴 구간이기 때문입니다. 접근 방법: 슬라이딩 윈도우 + 단조 데크 가능한 모든 부분 리스트를 일일이 검사하면 매우
문자열 s가 주어졌을 때, 서로 다른 문자를 최대 2개까지만 포함하는 가장 긴 부분 문자열(substring)의 길이를 찾는 문제입니다. 예를 들어 입력이 s = xyzzy라면 출력은 4가 됩니다. yzzy가 y와 z 두 종류의 문자만 사용하면서 만들 수 있는 가장 긴 부분 문자열이기 때문입니다. 이 문제는 슬라이딩 윈도우(Sliding Window) 기법과 문자 개수를 세는 해시 맵을 함께 사용하면 효율적으로 해결할 수 있습니다. 알고리즘의 동작 과정은 다음과 같습니다. start := 0 — 윈도우의 시작 인덱스를 초기화합니
문제 소개 이진 트리가 하나 주어져 있을 때, 루트(root) 노드에서 리프(leaf) 노드까지 이어지는 가장 긴 경로의 노드 값 합계를 구하는 것이 목표입니다. 만약 길이가 같은 경로가 둘 이상 존재한다면, 그중 합이 더 큰 경로의 값을 반환해야 합니다. 예를 들어 다음과 같은 이진 트리가 입력으로 주어지면, 출력 결과는 20이 됩니다. 루트 2에서 시작해 4 → 8 → 6으로 이어지는 경로가 가장 길며, 그 합은 2 + 4 + 8 + 6 = 20이기 때문입니다. 풀이 접근 방식 이 문제는 재귀(recursion)를 활용하면 간
소문자로 이루어진 문자열 s와 정수 k가 주어졌다고 가정해 봅시다. 여기서 런-길이 인코딩(Run-Length Encoding)은 반복되는 연속된 문자를 개수와 문자 형태로 표현하는 방식입니다. 예를 들어 문자열 aaabbc는 3a2bc로 인코딩됩니다. 이때 c처럼 한 번만 나타나는 문자에는 1c라고 표기하지 않고 그대로 씁니다.우리가 해야 할 작업은 다음과 같습니다. 먼저 문자열 s에서 임의의 k개의 연속된 문자를 제거한 뒤, 결과 문자열을 런-길이 인코딩했을 때 얻을 수 있는 최소 길이를 구하는 것입니다.예제로 이해하기입력이 s
이진 트리와 두 개의 숫자 a, b가 주어졌을 때, a와 b를 자손(descendant)으로 가지는 노드 중 가장 깊은 위치에 있는 노드의 값을 찾는 것이 목표입니다. 이런 노드를 최저 공통 조상(Lowest Common Ancestor, LCA)이라고 부릅니다. 이때 한 노드는 스스로의 자손이 될 수 있다는 점에 유의해야 합니다. 예를 들어 아래와 같은 이진 트리가 있다고 가정해 보겠습니다. a = 6, b = 2라면, 두 값을 모두 자손으로 가지면서 가장 깊은 노드는 값이 4인 노드입니다. 따라서 출력 결과는 4가 됩니다. 해
문자열 s가 주어졌을 때, 이 문자열이 회문(palindrome)이 되도록 만들기 위해 삽입해야 하는 최소 문자 수를 구하는 문제입니다.예를 들어 입력이 s = mad라면, am을 삽입하여 madam을 만들 수 있으므로 정답은 2가 됩니다.접근 방법이 문제는 재귀적 동적 계획법(Dynamic Programming)으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.두 포인터 i(시작)와 j(끝)를 사용해 부분 문자열을 탐색합니다.s[i]와 s[j]가 같다면 두 문자는 이미 회문의 양쪽 끝 역할을 할 수 있으므로, 안쪽 부분인
문제 개요 두 개의 리스트 l1과 l2가 주어졌을 때, 다음 연산을 반복 적용하여 두 리스트를 동일하게 만들어야 합니다. 연산 규칙: 임의의 부분 리스트(sublist)를 선택한 후, 해당 부분 리스트 전체를 그 요소들의 합으로 대체합니다. 목표는 이 연산을 적용한 뒤 얻을 수 있는 가장 긴 결과 리스트의 크기를 반환하는 것이며, 어떤 방식으로도 두 리스트를 같게 만들 수 없다면 -1을 반환합니다. 예시로 이해하기 입력이 l1 = [1, 4, 7, 1, 2, 10], l2 = [5, 6, 1, 3, 10]이라면 출력은 4입니다.
문제 설명서로 다른 액면가(1, 5, 10, 25)의 동전과 총 금액(amount)이 주어졌을 때, 그 금액을 정확히 만들기 위해 필요한 최소 동전 개수를 계산하는 함수를 정의해야 합니다.예를 들어 입력값이 64라면 출력은 7입니다. 이는 25 + 25 + 10 + 1 + 1 + 1 + 1 = 64처럼 동전 7개로 금액을 구성할 수 있기 때문입니다.해결 접근 방법이 문제는 동적 계획법(Dynamic Programming)을 활용하면 효율적으로 해결할 수 있습니다. 핵심 아이디어는 작은 금액부터 차례대로 최소 동전 개수를 계산해 나가