문제 소개 하나의 이진 트리(binary tree)가 주어졌을 때, 왼쪽 서브트리와 오른쪽 서브트리가 완전히 동일한 가장 큰 서브트리를 찾는 문제입니다. 이때 선호되는 시간 복잡도는 O(n)입니다. 예를 들어 아래와 같은 트리가 입력으로 주어진다면, 결과는 다음과 같이 나타납니다. 접근 방법 이 문제는 후위 순회(postorder traversal)를 활용한 재귀적 방식으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다. 각 노드를 기준으로 서브트리의 구조와 값을 문자열로 직렬화(인코딩)합니다. 왼쪽 서브트리의 인코딩
문제 소개두 개의 배열이 주어졌을 때, 가장 긴 바이토닉(bitonic) 수열을 찾는 것이 목표입니다. 이때 반드시 지켜야 할 조건은 다음과 같습니다.증가하는 부분은 반드시 첫 번째 배열(A)의 부분 수열(subsequence)이어야 합니다.감소하는 부분은 반드시 두 번째 배열(B)의 부분 수열이어야 합니다.예를 들어 입력이 A = [2, 6, 3, 5, 4, 6], B = [9, 7, 5, 8, 4, 3]이라면 출력은 [2, 3, 4, 6, 9, 7, 5, 4, 3]이 됩니다. 이 수열은 2 → 3 → 4 → 6까지 배열 A에서
문자열이 하나 주어졌을 때, 문자열에서 문자를 삭제하거나 재배열(shuffle)하여 만들 수 있는 가장 긴 회문(palindrome)을 찾아야 합니다. 만약 만들 수 있는 회문이 여러 개라면 그중 하나만 반환하면 됩니다.예를 들어 입력이 pqqprrs라면, 출력은 pqrsrqp가 됩니다.접근 방법회문은 왼쪽 절반과 오른쪽 절반이 거울상처럼 대칭을 이루는 문자열입니다. 따라서 각 문자를 짝수 개씩 좌우에 배치하고, 개수가 홀수인 문자는 최대 하나만 가운데에 둘 수 있습니다. 이 성질을 활용하면 다음과 같은 단계로 문제를 해결할 수 있
문제 개요두 개의 배열이 있고, 이 둘은 단 하나의 요소를 제외하면 완전히 동일한(복제 관계인) 배열이라고 가정해 보겠습니다. 즉, 한쪽 배열에만 존재하는 요소가 하나 있다는 의미입니다. 우리의 목표는 바로 이 누락된 요소를 찾아내는 것입니다.예를 들어 입력이 A = [2, 5, 6, 8, 10], B = [5, 6, 8, 10]이라면, 두 번째 배열에는 2가 존재하지 않으므로 결과값은 2가 됩니다.해결 접근 방식두 배열이 정렬되어 있다는 전제 조건이 있다면, 선형 탐색 대신 이진 탐색(Binary Search)을 활용하여 O(lo
정수로 이루어진 배열이 주어졌을 때, 배열의 각 요소에 대해 가장 가까운 왼쪽 작은 값과 가장 가까운 오른쪽 작은 값 사이의 최대 절대 차이를 구하는 문제를 살펴보겠습니다.만약 어떤 요소의 왼쪽이나 오른쪽에 더 작은 요소가 존재하지 않는다면, 해당 방향의 작은 값은 0으로 간주합니다.문제 예시입력 배열이 다음과 같다고 가정해 보겠습니다.A = [3, 5, 9, 8, 8, 10, 4]이 경우 출력 결과는 4가 됩니다. 그 이유는 다음과 같습니다.왼쪽 작은 요소 배열 L = [0, 3, 5, 5, 5, 8, 3]오른쪽 작은 요소 배열
```html N개의 도시가 있으며, 각 도시는 0부터 N-1까지 번호가 매겨져 있다고 가정해 보겠습니다. 또한 역이 설치된 도시들의 목록도 함께 주어집니다. 우리가 구해야 하는 값은 임의의 도시에서 가장 가까운 역까지의 거리 중 최대값입니다. 이때 역이 있는 도시들은 순서에 상관없이 주어질 수 있다는 점에 유의해야 합니다. 예를 들어 입력이 N = 6이고 stations = [2, 4]라면 출력은 2가 됩니다. 도시 0에서 가장 가까운 역(2번)까지의 거리가 2로, 모든 도시 중 가장 먼 거리이기 때문입니다. 문제 해결 접근 방법
뱀 시퀀스(Snake Sequence)란?숫자로 채워진 2차원 격자(grid)에서 뱀 시퀀스를 찾는 문제를 생각해 보겠습니다. 가능한 시퀀스가 여러 개라면 그중 하나만 반환하면 됩니다.뱀 시퀀스는 격자에서 서로 인접한 칸의 숫자들을 연결해 만든 수열입니다. 조건은 간단합니다. 현재 값이 셀 (a, b)에 있을 때, 오른쪽 칸 (a, b+1) 또는 아래쪽 칸 (a+1, b)에 있는 값이 현재 값과 정확히 ±1만큼 차이가 나야 합니다. 즉, 값이 1씩 오르거나 내려가는 방향으로만 이동할 수 있습니다.예제로 살펴보기다음과 같은 4×4 격
정수 X가 주어졌을 때, 처음 N개의 자연수 제곱의 합(1² + 2² + ... + N²)이 X를 초과하지 않는 최대값 N을 구하는 문제를 살펴보겠습니다.예를 들어 입력이 X = 7이라면 출력은 2가 됩니다. N = 3일 경우 수열의 합이 1² + 2² + 3² = 1 + 4 + 9 = 14로 X = 7을 초과하기 때문입니다. 따라서 조건을 만족하는 N의 최댓값은 2입니다.해결 접근 방식이 문제는 이진 탐색(Binary Search)을 활용하면 효율적으로 해결할 수 있습니다. N이 커질수록 제곱의 합도 단조 증가하기 때문에, 특정
문제 설명 두 수 P와 Q가 있으며, 이 두 수로 N = (P!/Q!)라는 수를 만든다고 가정해 보겠습니다. 목표는 가능한 한 많은 연산을 수행하여 N을 1로 줄이는 것입니다. 각 연산에서는 N이 X로 나누어떨어지는 경우 N을 N/X로 대체할 수 있으며, 가능한 최대 연산 횟수를 반환해야 합니다. 예를 들어 입력이 A = 7, B = 4라면 출력은 4가 됩니다. 이 경우 N은 210이며, 소인수가 2, 3, 5, 7로 총 4개이기 때문입니다. 접근 방법 이 문제를 해결하기 위해 다음 단계를 따릅니다. N := 1000005로 설정
N개의 요소로 이루어진 배열 A와 두 개의 정수 l, r이 주어져 있다고 가정해 보겠습니다(단, 1 ≤ ax ≤ 10^5, 1 ≤ l ≤ r ≤ N). 배열에서 임의의 요소 ax를 선택해 제거하면, 동시에 ax+1, ax+2 … ax+r에 해당하는 모든 요소와 ax−1, ax−2 … ax−l에 해당하는 모든 요소도 함께 배열에서 사라집니다. 이 작업을 수행하면 ax만큼의 포인트를 얻게 되며, 우리의 목표는 배열의 모든 요소를 제거한 후 획득한 총 포인트를 최대화하는 것입니다.예를 들어 입력이 A = [2,4,3,10,5], l =
문제 개요양수로만 이루어진 배열이 주어져 있다고 가정해 봅시다. 배열에는 n개의 요소가 있으며, 우리는 다음 두 조건을 동시에 만족하는 삼중항(ai + aj + ak)의 최대 합을 구해야 합니다.조건: 0 <= i < j < k < n 이면서 ai < aj < ak즉, 세 요소의 인덱스 순서와 값의 크기 순서가 모두 오름차순을 유지해야 한다는 의미입니다.입력 예시배열 A = [3, 6, 4, 2, 5, 10]이 주어졌을 때, 가능한 삼중항과 각각의 합은 다음과 같습니다.(3, 4, 5): 합 = 12
이진 탐색 트리(Binary Search Tree, BST)가 주어졌을 때, 이 트리의 중앙값(median)을 구하는 문제를 생각해 봅시다.중앙값의 정의는 노드 개수에 따라 다음과 같습니다.노드 수가 짝수일 때: 중앙값 = ((n/2번째 노드 + (n+1)/2번째 노드) / 2노드 수가 홀수일 때: 중앙값 = (n+1)/2번째 노드예를 들어 아래와 같은 BST가 입력으로 주어지면, 출력은 7이 됩니다.접근 방법: 모리스 순회(Morris Traversal)일반적인 중위 순회(inorder traversal)는 재귀 호출이나 스택을
문제 개요양수로만 이루어진 배열이 주어졌다고 가정해 보겠습니다. 배열의 각 원소를 새로운 값으로 교체하여, 인접한 두 원소의 차이가 항상 주어진 target 값 이하가 되도록 만들어야 합니다. 이때 우리의 목표는 조정 비용, 즉 새 값과 기존 값의 차이의 절댓값 합을 최소화하는 것입니다.수식으로 표현하면 ∑|A[i] − Anew[i]|를 최소화하는 문제이며, 여기서 i는 0부터 n−1까지의 범위입니다(n은 배열 A의 크기). Anew는 인접 원소 간 차이가 target 이하가 되도록 조정된 배열을 의미합니다.예를 들어 입력이 [56
서로 다른 소요 시간을 가진 여러 작업(job)의 배열이 있고, 이를 수행할 k명의 담당자가 있다고 가정해 봅시다. 또한 각 담당자가 작업 한 단위를 처리하는 데 걸리는 시간 t도 주어집니다. 우리는 다음과 같은 제약 조건 하에 모든 작업을 완료하는 데 필요한 최소 시간을 구해야 합니다. 한 명의 담당자에게는 연속된 작업만 배정할 수 있습니다. 두 명의 담당자가 하나의 작업을 나누어 수행하거나 공유할 수 없습니다. 예를 들어, 입력이 k = 4, t = 5, job = {12, 6, 9, 15, 5, 9}라면 출력은 75가 됩니
오름차순으로 정렬된 서로 다른 n개의 숫자로 이루어진 배열 A가 있다고 가정해 보겠습니다. 이 배열에는 요소 하나가 빠져 있으며, 우리의 목표는 바로 그 누락된 요소를 찾아내는 것입니다. 예를 들어 입력이 A = [1, 2, 3, 4, 5, 6, 7, 9]라면, 1부터 9까지 연속된 숫자 중 8이 빠져 있으므로 출력 결과는 8이 됩니다. 접근 방법: 이진 탐색 배열이 이미 정렬되어 있기 때문에 이진 탐색(Binary Search)을 활용하면 선형 탐색보다 훨씬 효율적으로 문제를 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.
두 개의 정수 N과 K가 주어졌을 때, 서로 다른 N개의 값을 찾아 이들을 비트별 OR(bitwise OR) 연산했을 때 그 결과가 정확히 K와 같아지도록 해야 합니다. 만약 가능한 조합이 존재하지 않는다면 -1을 반환합니다.예를 들어 입력이 N = 4, K = 6이라면 출력은 [6, 0, 1, 2]가 됩니다. 실제로 6 | 0 | 1 | 2 = 6이므로 조건을 충족합니다.해결 접근 방법이 문제는 다음 단계에 따라 해결할 수 있습니다.MAX := 32로 설정합니다.visited := 크기가 MAX인 리스트를 생성하고 False로 채
문제 개요소문자로만 이루어진 길이 m인 문자열이 주어졌을 때, 이 문자열에서 만들 수 있는 모든 순열을 사전식(lexicographic) 순서로 정렬했을 때 n번째 순열을 찾는 문제입니다.예를 들어 문자열이 pqr이고 n = 3이라면, 전체 순열은 [pqr, prq, qpr, qrp, rpq, rqp]처럼 정렬된 순서로 나열되므로 세 번째인 qpr이 결과가 됩니다.해결 접근 방법모든 순열을 직접 생성하는 것은 비효율적이므로, 각 자리에 올 수 있는 문자를 결정하면서 남은 순열의 개수를 계산(다항계수 활용)하여 n번째 순열을 효율적으
수열 bn이 다음과 같은 점화식으로 정의되어 있다고 가정해 봅시다.b1 = 1, bn+1/bn = 2n이때 주어진 n에 대해 log2(bn)의 값을 구하는 것이 목표입니다.예를 들어 입력값이 6이라면 출력은 15가 됩니다. 그 이유는 log2(bn) = (n × (n - 1)) / 2 이므로, (6 × (6 - 1)) / 2 = 15가 되기 때문입니다.수학적 풀이 과정이 문제는 점화식을 단계적으로 전개하여 해결할 수 있습니다.bn+1/bn = 2nbn/bn-1 = 2n-1...b2/b1 = 21위의 모든 식을 좌변끼리, 우변끼리 곱
문제 개요어떤 배열의 모든 가능한 요소 쌍에 대한 최대공약수(GCD) 값들이 주어진 배열 A가 있다고 가정해 봅시다. 이때 우리의 목표는 이 GCD 배열을 만드는 데 사용된 원래 숫자들을 찾아내는 것입니다.예를 들어, 입력이 A = [6, 1, 1, 13]이라면 출력은 [13, 6]이 됩니다. 그 이유는 다음과 같습니다.gcd(13, 13) = 13gcd(13, 6) = 1gcd(6, 13) = 1gcd(6, 6) = 6즉, 두 숫자 13과 6으로 만들 수 있는 네 가지 쌍의 GCD 결과가 정확히 입력 배열과 일치합니다.해결 접근
서로 다른 양의 정수로 구성되어 있고 오름차순으로 정렬된 이중 연결 리스트(doubly linked list)가 있다고 가정해 봅시다. 이때 리스트 안에서 두 노드 데이터의 곱이 주어진 값 x와 같아지는 모든 쌍(pair)을 찾아야 합니다. 여기서 중요한 제약 조건은 추가적인 메모리 공간을 사용하지 않고 문제를 해결해야 한다는 점입니다.예를 들어, 입력이 L = 1 ↔ 2 ↔ 4 ↔ 5 ↔ 6 ↔ 8 ↔ 9이고 x = 8이라면, 곱이 8이 되는 쌍은 (1, 8)과 (2, 4)이므로 출력은 다음과 같습니다.(1, 8), (2, 4)접