정렬된 두 개의 연결 리스트 L1과 L2가 주어졌을 때, 이 두 리스트에 공통으로 존재하는 원소들만 담고 있는 새로운 정렬된 연결 리스트를 만들어야 합니다.예를 들어 입력이 L1 = [2, 4, 8], L2 = [3, 4, 8, 10]이라면, 두 리스트에 모두 포함된 값은 4와 8이므로 출력은 [4, 8]이 됩니다.해결 접근 방식두 리스트가 이미 정렬되어 있기 때문에, 각 리스트의 앞부분부터 동시에 순회하면서 값을 비교하는 투 포인터(two pointer) 기법으로 효율적으로 해결할 수 있습니다. 알고리즘의 동작 순서는 다음과 같습
문제 개요단일 연결 리스트(singly linked list)와 하나의 값 k가 주어졌을 때, 노드들을 다음 순서로 재배열하는 프로그램을 만들어 보겠습니다.k보다 작은 값을 가진 노드들이 가장 먼저 옵니다.k와 같은 값을 가진 노드들이 그다음에 옵니다.k보다 큰 값을 가진 노드들이 마지막에 옵니다.핵심 제약 조건은 각 그룹 안에서 노드들의 상대적인 순서가 그대로 유지되어야 한다는 점입니다. 즉, 안정적(stable)인 분할이 필요합니다.예를 들어 입력이 L = [4, 3, 6, 6, 6, 10, 8]이고 k = 6이라면 출력은 [4
문제 개요 단일 연결 리스트(singly linked list)가 주어졌을 때, 다음 규칙에 따라 이를 이진 트리(binary tree)로 변환하는 것이 목표입니다. 연결 리스트의 머리 노드(head)는 트리의 루트(root)가 됩니다. 이후의 각 노드는 값이 부모 노드보다 작으면 왼쪽 자식으로, 그렇지 않으면 오른쪽 자식으로 배치됩니다. 예를 들어 입력이 [2, 1, 3, 4, 0, 5]라면 변환 결과는 다음과 같습니다. 2가 루트가 되고, 1은 2보다 작으므로 왼쪽 자식이 됩니다. 3은 1보다 크므로 1의 오른쪽 자식,
정렬된 두 연결 리스트 L1과 L2가 주어졌을 때, 두 리스트의 합집합(union)에 해당하는 새로운 정렬된 연결 리스트를 반환하는 프로그램을 만들어 보겠습니다. 합집합이란 두 리스트에 등장하는 모든 값을 포함하되, 양쪽에 공통으로 존재하는 중복 값은 한 번만 담는 것을 의미합니다.예를 들어 입력이 다음과 같다면,L1 = [10, 20, 30, 40, 50, 60, 70]L2 = [10, 30, 50, 80, 90]출력은 중복이 제거된 [10, 20, 30, 40, 50, 60, 70, 80, 90]이 됩니다.문제 해결 접근 방식두
이진 문자열 s가 주어졌다고 가정해 보겠습니다. 문자열 안에서 최대 한 쌍의 문자를 서로 교환할 수 있을 때, 그 결과로 만들 수 있는 가장 긴 연속된 1(연속 부분 문자열)의 길이를 구하는 것이 목표입니다.문제 예시예를 들어 입력이 s = 1111011111이라면 출력은 9가 됩니다. 인덱스 4의 0과 인덱스 9의 1을 서로 교환하면 9개의 연속된 1을 얻을 수 있기 때문입니다.접근 방법: 슬라이딩 윈도우이 문제는 슬라이딩 윈도우(Sliding Window) 기법으로 효율적으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다
문제 개요엄격하게 오름차순으로 정렬된 양의 정수 리스트 nums가 주어졌다고 가정해 봅시다. 이때 모든 i > 1에 대해 A[i] = A[i - 1] + A[i - 2] 조건을 만족하는 가장 긴 부분 수열 A(최소 길이 3)의 길이를 구해야 합니다.예를 들어 입력이 nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]라면, [1, 2, 3, 5, 8, 13]을 선택할 수 있으므로 출력은 6이 됩니다.해결 접근 방법이 문제는 다음 단계를 통해 해결할 수 있습니다.A := nums, n
각 구간이 [시작, 끝] 형태로 표현되는 구간(interval) 목록이 주어졌다고 가정해 보겠습니다. 이때 서로 겹치는 구간들을 자유롭게 병합하여 만들 수 있는 가장 긴 구간의 길이를 구하는 것이 목표입니다. 예를 들어 입력이 [[1, 6], [4, 9], [5, 6], [11, 14], [16, 20]]라고 해보겠습니다. [1, 6]과 [4, 9]는 서로 겹치므로 하나로 합칠 수 있으며, 병합된 구간 [1, 9]의 길이는 9입니다. 따라서 출력은 9가 됩니다. 알고리즘 접근 방식 이 문제는 정렬 후 순차적 병합 전략으로 효율적으로
숫자로 이루어진 리스트 nums가 주어졌을 때, 연속된 숫자들의 부호가 양수와 음수로 번갈아 바뀌는 가장 긴 부분 수열(subsequence)의 길이를 구하는 프로그램을 만들어 보겠습니다.문제 예시예를 들어 입력이 다음과 같다고 가정해 봅시다.nums = [1, 3, -6, 4, -3]이 경우 출력은 4가 됩니다. [1, -6, 4, -3]처럼 양수와 음수가 교차하도록 원소를 선택할 수 있고, 이보다 더 긴 부호 교차 부분 수열은 존재하지 않기 때문입니다.해결 접근 방법이 문제는 동적 계획법(DP) 개념을 활용한 간단한 선형 탐색으
숫자로 이루어진 리스트 nums가 주어졌을 때, 값이 먼저 엄격하게 증가한 후 엄격하게 감소하는(산 모양) 가장 긴 부분 리스트의 길이를 찾아야 합니다. 이때 부분 리스트의 최소 길이는 3 이상이어야 합니다.예를 들어, 입력이 nums = [8, 2, 4, 6, 3, 1]이라면 출력은 5가 됩니다. 부분 리스트 [2, 4, 6, 3, 1]이 2 → 4 → 6으로 엄격하게 증가한 뒤 6 → 3 → 1로 엄격하게 감소하기 때문입니다.해결 알고리즘이 문제는 리스트를 한 번만 순회하면서 증가 구간과 감소 구간의 길이를 각각 세는 방식으로
문제 개요0과 1로만 이루어진 이진 리스트가 하나 주어지고, 숫자 k가 함께 제공됩니다. 우리는 최대 k개의 0을 1로 바꿀 수 있으며, 그 결과 모든 요소가 1인 가장 긴 연속 부분 리스트(sublist)의 길이를 구해야 합니다.예를 들어 입력이 nums = [0, 1, 1, 0, 0, 1, 1], k = 2라고 해 보겠습니다. 가운데에 있는 두 개의 0을 1로 바꾸면 리스트가 [0, 1, 1, 1, 1, 1, 1]이 되므로, 정답은 6이 됩니다.접근 방법: 슬라이딩 윈도우이 문제는 슬라이딩 윈도우(Sliding Window) 기
문제 소개 숫자로 이루어진 리스트 nums와 정수 k가 주어졌을 때, 구간 안에서 최댓값과 최솟값의 절대 차이가 k 이하가 되는 가장 긴 연속 부분 리스트(sublist)의 길이를 구하는 프로그램을 만들어 보겠습니다. 예시 nums = [2, 4, 6, 10], k = 4가 주어진다면 결과는 3입니다. [2, 4, 6]을 선택하면 최댓값 6과 최솟값 2의 차이가 정확히 4로 조건을 만족하고, 이보다 긴 구간은 조건을 벗어나기 때문입니다. 접근 방법: 슬라이딩 윈도우 + 단조 데크 이 문제는 투 포인터 기반의 슬라이딩 윈도우와 두 개
문제 개요 문자열 s와 숫자 k가 주어질 때, 모든 문자가 최소 k번 이상 등장하는 가장 긴 부분 문자열의 길이를 구하는 프로그램을 작성해야 합니다. 예를 들어 입력이 s = aabccddeeffghij, k = 2라고 가정해 보겠습니다. 이때 출력은 8입니다. 가장 긴 부분 문자열은 ccddeeff이며, 여기에 포함된 모든 문자(c, d, e, f)가 정확히 2번씩 등장하여 조건을 만족하기 때문입니다. 해결 접근 방법 이 문제는 재귀(분할 정복) 기법으로 효과적으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다. k번
숫자 n이 주어졌을 때, 룩 앤 세이(Look and Say) 수열의 n번째 항을 생성하는 문제입니다. 이 수열은 직전 항을 읽으면서 연속된 숫자의 개수를 함께 말하는 방식으로 만들어지며, 처음 몇 개의 항은 다음과 같습니다.111211211111221룩 앤 세이 수열의 읽는 방법각 항은 바로 앞 항을 왼쪽부터 차례로 읽으며, 같은 숫자가 연속으로 나타나는 횟수를 세어 개수 + 숫자 형태로 표현합니다.1 — 첫 번째 항은 하나(1)로 시작합니다.11 — 이전 항 1을 읽어 1이 하나라고 말합니다.21 — 이전 항 11을 읽어 1이
문제 소개정수로 구성된 중첩 리스트(nested list)가 주어질 때, 리스트 안의 모든 정수를 각자의 깊이에 맞는 가중치로 곱한 뒤 합산한 값을 반환하는 문제입니다. 여기서 각 요소는 정수이거나 리스트일 수 있으며, 리스트 내부의 요소 역시 정수 또는 또 다른 리스트일 수 있습니다.앞선 문제(중첩 목록 가중치 합계 I)에서는 루트에서 리프로 내려갈수록 가중치가 커지는 방식이었다면, 이번 문제는 정반대로 아래에서 위로(bottom-up) 가중치를 매깁니다. 즉, 가장 안쪽 레벨(리프)의 정수는 가중치 1을 가지며, 가장 바깥쪽 레
nums라는 숫자 리스트와 target이라는 값이 주어졌을 때, target보다 커야 하는 숫자 쌍의 합 중에서 가장 작은 값을 찾아야 합니다.예를 들어, 입력이 nums = [2, 4, 6, 10, 14]이고 target = 10이라면 출력은 12가 됩니다. 2와 10을 선택하면 합이 12로, target(10)보다 크면서 가능한 모든 쌍 중에서 가장 작은 값이기 때문입니다.문제 해결 접근 방법이 문제는 투 포인터(Two Pointer) 기법을 활용하면 효율적으로 해결할 수 있습니다. 리스트를 먼저 정렬한 뒤, 양쪽 끝에서 시작하
숫자로 이루어진 리스트 nums가 있다고 가정해 보겠습니다. 이 리스트에는 총 n개의 값이 담겨 있으며, 각 숫자는 특정 후보에게 표를 던진 투표를 의미합니다. 우리가 구해야 할 것은 전체 표 수의 절반을 넘는, 즉 floor(n/2)보다 많은 득표를 기록한 후보의 ID입니다. 만약 과반수 득표를 한 후보가 존재하지 않는다면 -1을 반환하면 됩니다.예를 들어 입력이 nums = [6, 6, 2, 2, 3, 3, 3, 3, 3]이라면 어떻게 될까요? 전체 표는 9개이고, 숫자 3은 5번 등장하므로 floor(9/2) = 4보다 많습니
동전 종류가 담긴 리스트와 목표 금액(amount)이 주어졌을 때, 이 동전들을 조합하여 목표 금액을 정확히 만들 수 있는 조합의 개수를 구하는 문제입니다. 만약 결과값이 매우 크다면 10^9 + 7로 나눈 나머지를 반환해야 합니다.예를 들어, 입력이 coins = [2, 5], amount = 10이라면 출력은 2가 됩니다. 다음과 같은 두 가지 조합으로 10을 만들 수 있기 때문입니다.[2, 2, 2, 2, 2][5, 5]문제 해결 접근 방식이 문제는 대표적인 동적 계획법(Dynamic Programming) 유형으로 풀 수 있
0과 1로 이루어진 이진 행렬이 주어졌을 때, 각 셀의 값을 가장 가까운 0까지의 맨해튼 거리(Manhattan Distance)로 바꾼 행렬을 구하는 문제를 생각해 봅시다. 이때 행렬에는 최소한 하나 이상의 0이 존재한다고 가정합니다.문제 예시입력 행렬이 다음과 같다고 가정해 보겠습니다.101101110그렇다면 출력 결과는 다음과 같습니다.101101210왼쪽 아래 셀(값 1)은 가장 가까운 0까지의 거리가 2이므로 값이 2로 변경됩니다. 나머지 셀들은 인접한 0과의 거리가 그대로 유지됩니다.해결 접근 방법: 두 번의 스캔으로 거
각 행과 열이 비내림차순(오름차순)으로 정렬되어 있는 2차원 행렬이 주어졌을 때, 이 행렬에서 n번째로 작은 수를 찾는 문제입니다.예를 들어 다음과 같은 행렬이 입력으로 주어진다고 가정해 보겠습니다.243034316632이때 n = 4라면, 출력 결과는 6이 됩니다.문제 해결 접근 방법이 문제는 다음 단계를 따라 간단하게 해결할 수 있습니다.빈 리스트(lst)를 하나 생성합니다.행렬의 각 행 i에 대해 반복합니다.행 i의 각 요소 j에 대해 반복하며, j를 lst의 끝에 추가합니다.리스트 lst 전체를 오름차순으로 정렬합니다.lst
2차원 행렬이 있고, 각 행과 각 열이 오름차순(비내림차순)으로 정렬되어 있다고 가정해 보겠습니다. 이때 주어진 목표 값(target)이 이 행렬 안에 존재하는지 확인하는 프로그램을 작성해야 합니다.예를 들어 입력이 다음과 같다고 가정해 봅시다.243034316632그리고 target = 31이라면, 출력 결과는 True가 됩니다.문제 해결 접근 방법이 문제는 행렬의 오른쪽 위 모서리에서 탐색을 시작하는 계단식 탐색(staircase search) 기법으로 효율적으로 해결할 수 있습니다. 행과 열이 모두 정렬되어 있기 때문에, 현재