숫자로 이루어진 리스트 nums와 정수 k가 주어졌다고 가정해 봅시다. 이 리스트를 k개의 연속된(contiguous) 그룹으로 나누려고 합니다. 여기서 가장 작은 그룹은 모든 그룹 중에서 원소의 합이 가장 작은 그룹을 의미하며, 우리의 목표는 이 최소 그룹의 합이 가질 수 있는 최댓값을 구하는 것입니다. 문제 이해하기 예를 들어 입력이 nums = [2, 6, 4, 5, 8], k = 3이라면 출력은 8이 됩니다. 리스트를 [2, 6], [4, 5], [8]처럼 세 그룹으로 나눌 수 있고, 각 그룹의 합은 8, 9, 8이므로 가장
문제 소개문자열 s와 또 다른 문자열 t가 주어져 있고, t는 s의 부분 수열(subsequence)이라고 가정해 봅시다. 이때 우리가 해야 할 일은, s에서 하나의 연속된 부분 문자열(substring)을 제거한 후에도 여전히 t가 s의 부분 수열로 남아 있도록 하면서, 제거할 수 있는 부분 문자열의 최대 길이를 구하는 것입니다.예를 들어 입력이 s = xyzxyxz, t = yz라고 한다면, 출력은 4가 됩니다. 인덱스 2부터 5까지의 부분 문자열 zxyx를 제거하면 남는 문자열은 xyz가 되고, 이 안에는 여전히 yz가 부분
문제 설명 숫자 리스트 nums와 쿼리 리스트가 주어지며, 각 쿼리는 [x, limit] 형태입니다. 각 쿼리에 대해 다음 작업을 수행해야 합니다. nums에서 e ≤ limit 조건을 만족하는 요소 e를 찾습니다. 그중 e XOR x 값이 가장 커지는 요소를 선택합니다. 조건을 만족하는 요소가 하나도 없으면 -1을 반환합니다. 예를 들어 nums = [3, 5, 9], queries = [[4, 6], [2, 0]]이라면 결과는 [3, -1]입니다. 첫 번째 쿼리(x=4, limit=6)에서는 6 이하인 3과 5가 후보입니다.
겹치지 않는(non-overlapping) 간격들의 리스트가 있다고 가정해 보겠습니다. 이 간격들은 종료 시간을 기준으로 정렬되어 있습니다. 여기에 또 다른 간격인 target이 주어졌을 때, target을 기존 간격들과 병합한 후에도 전체 간격 리스트가 여전히 겹치지 않고 정렬된 상태를 유지하도록 최종 결과를 구하는 것이 이번 문제입니다.예를 들어, 입력이 intervals = [[1, 15], [25, 35], [75, 90]], target = [10, 30]이라면 출력은 [[1, 35], [75, 90]]가 됩니다. targ
문제 개요4×4 크기의 문자 보드와 단어 목록이 주어졌을 때, 보드 위에서 인접한 문자들을 연결하여 만들 수 있는 단어의 최대 개수를 구하는 문제입니다. 이때 각 단어를 만들 때는 한 칸을 한 번만 사용할 수 있지만, 서로 다른 단어를 만들 때는 같은 칸을 다시 사용해도 됩니다.이동 방향은 상하좌우뿐 아니라 대각선 방향도 허용됩니다.예제 입력예를 들어 아래와 같은 문자 보드가 있다고 가정해 봅시다.mbfdxayatztrsqqq단어 목록이 words = [bat, far, mat]일 때, 출력 결과는 3입니다. 각 단어는 다음 경로로
문제 개요 숫자로 이루어진 리스트 nums가 주어졌다고 가정해 보겠습니다. 두 수 nums[i] ≤ nums[j] 사이에 다른 어떤 수도 존재하지 않을 때, 이 두 수를 인접(adjacent)하다고 정의합니다. 우리가 구해야 할 것은 인접한 두 수 nums[i]와 nums[j]에 대해 가능한 최소의 |j − i| 값입니다. 예를 들어 입력이 nums = [1, -9, 6, -6, 2]라면 출력은 2가 됩니다. 이 리스트에서 2와 6은 서로 인접한 값이며, 두 요소의 인덱스 차이가 정확히 2이기 때문입니다. 해결 전략 이 문제는 다
문제 개요문자열 s가 주어졌을 때, 인접한 두 문자를 맞바꾸는 스왑(swap) 연산만을 사용해 이 문자열을 회문(palindrome)으로 만들어야 한다고 가정해 봅시다. 이때 필요한 스왑의 최소 횟수를 구하는 것이 목표입니다. 만약 어떤 방법을 사용해도 회문을 만들 수 없다면 -1을 반환합니다.예를 들어 입력이 s = xxyy라면 출력은 2가 됩니다. 그 이유는 다음과 같습니다.먼저 가운데의 x와 y를 스왑하여 문자열을 xyxy로 만듭니다.그다음 앞의 두 문자 x와 y를 스왑하면 yxxy가 되고, 이 문자열은 회문입니다.해결 접근
두 개의 문자열 s와 t가 주어졌을 때, s 안에서 t의 모든 문자를 포함하는 가장 짧은 부분 문자열(substring)의 길이를 구하는 문제입니다. 만약 그러한 부분 문자열이 존재하지 않는다면 -1을 반환해야 합니다.예를 들어, s = thegrumpywizardmakes, t = wake라고 입력하면 출력은 10이 됩니다. w, a, k, e 네 문자를 모두 포함하는 가장 짧은 구간이 wizardmake(길이 10)이기 때문입니다.해결 접근 방식: 슬라이딩 윈도우이 문제는 투 포인터 기반의 슬라이딩 윈도우(Sliding Wind
문제 개요숫자로만 이루어진 두 문자열 s와 t가 주어집니다. 각 문자열에서 일부 자릿수를 제거하여 다음 두 조건을 만족해야 합니다.제거 후 두 문자열이 완전히 동일해야 합니다.삭제된 자릿수들의 합이 최소가 되어야 합니다.마지막으로 최소화된 삭제 합계를 반환하면 됩니다.예를 들어 입력이 s = 41272, t = 172라면 출력은 6입니다. 첫 번째 문자열에서 4와 2를 제거하면 172가 되고, 삭제된 숫자의 합은 4 + 2 = 6이기 때문입니다.접근 방법: 가중치 적용된 LCS이 문제는 최장 공통 부분 수열(Longest Commo
1차원 직선 위에 집들의 위치를 나타내는 숫자 리스트 nums가 주어졌다고 가정해 보겠습니다. 우리는 이 직선의 어느 위치에든 배치할 수 있는 가로등 3개를 가지고 있으며, 위치 x에 놓인 가로등은 반경 r을 기준으로 [x − r, x + r] 범위(양 끝 포함)에 있는 모든 집을 밝힙니다. 이때 모든 집을 밝히기 위해 필요한 최소 반경 r을 구하는 것이 이 문제의 목표입니다.예를 들어 nums = [4, 5, 6, 7]이 입력으로 주어지면 결과는 0.5입니다. 가로등을 각각 4.5, 5.5, 6.5 위치에 놓으면 r = 0.5만으
문제 설명0과 1로 이루어진 숫자 리스트 nums와 정수 값 k가 주어진다고 가정해 봅시다.여기에는 길이가 k인 부분 리스트(연속된 구간)를 선택해 뒤집는 연산이 있습니다. 뒤집기를 수행하면 해당 구간 안의 모든 1은 0으로, 모든 0은 1로 바뀝니다. 우리는 리스트의 모든 1을 0으로 만들기 위해 필요한 최소 연산 횟수를 구해야 하며, 아무리 시도해도 모두 0으로 만들 수 없다면 -1을 반환해야 합니다.예를 들어 입력이 nums = [1,1,1,0,0,1,1,1], k = 3이라면 출력은 2가 됩니다. 앞의 세 개 숫자를 한 번
문제 설명이진 문자열(binary string) s가 주어졌다고 가정해 보겠습니다. 문자열의 일부 접두사(prefix)를 잘라 맨 뒤로 이동(회전)할 수 있을 때, 인접한 두 문자가 서로 같지 않도록 — 즉 0과 1이 번갈아 나타나는 교대(alternating) 패턴을 만들기 위해 뒤집어야 하는 문자의 최소 개수를 구하는 것이 목표입니다.예를 들어 입력이 s = "10010101111"이라면 정답은 2입니다. 접두사 "10"을 잘라 뒤로 붙이면 문자열은 "01010111110"이
문제 개요 동물들의 초기 상태를 나타내는 문자열 s가 주어졌다고 가정해 보겠습니다. 각 동물은 다음 세 가지 상태 중 하나를 가집니다. L: 왼쪽으로 이동하는 동물 R: 오른쪽으로 이동하는 동물 @: 제자리에 정지해 있는 동물 한 방향으로 이동 중인 동물은 반대 방향에서 힘을 받지 않는 한 마주치는 다른 동물들을 끌고 가 함께 움직입니다. 하지만 반대 방향의 힘을 동시에 받게 되면 그 자리에 멈춰 서게 됩니다. 우리의 목표는 모든 동물이 멈췄을 때 각 동물의 최종 방향을 구하는 것입니다. 예를 들어 입력이 s = @@L@R@@
문제 설명두 개의 숫자 리스트가 주어진다고 가정해 보겠습니다. 하나는 weights(무게), 다른 하나는 values(가치)이며, 두 리스트의 길이는 서로 같습니다. 또한 capacity(최대 용량)와 count(최대 개수)라는 두 값도 함께 주어집니다. 여기서 weights[i]와 values[i]는 i번째 물건의 무게와 가치를 각각 나타냅니다.우리는 담은 물건들의 총 무게가 capacity를 넘지 않고, 물건의 개수가 count를 넘지 않도록 가방에 담아야 합니다. 단, 각 물건은 최대 한 번만 선택할 수 있습니다. 이 조건 안
문자열 s가 주어졌다고 가정해 봅시다. 이 문자열은 여는 괄호 (와 닫는 괄호 )로만 구성되어 있습니다. 우리가 구해야 할 것은 이 문자열 안에서 가장 긴 유효한(잘 짜여진) 괄호 부분 문자열의 길이입니다.예를 들어 입력이 )()(())()) 형태인 )((())()) 라면, 가장 긴 유효한 부분 문자열은 (())()이므로 결과는 6이 됩니다.문제 해결 접근 방법이 문제는 스택(Stack)을 활용하면 효율적으로 해결할 수 있습니다. 핵심 아이디어는 각 문자의 인덱스를 스택에 저장하면서, 유효한 괄호 쌍이 완성될 때마다 현재 위치와 마
0은 빈 칸을, 1은 그 자리에 놓인 체스 퀸을 나타내는 이진 행렬이 주어졌다고 가정해 보겠습니다. 이때 현재 보드 상태에서 퀸을 추가로 배치하여 유효한 N-Queens 해답을 완성할 수 있는지 확인해야 합니다. N-Queens 퍼즐은 n × n 체스판에 n개의 퀸을 배치하되, 어떤 두 퀸도 서로 공격할 수 없도록 만드는 고전적인 문제입니다. 퀸은 가로, 세로, 대각선 어느 방향으로든 움직일 수 있기 때문에, 모든 퀸은 서로 다른 행, 서로 다른 열, 서로 다른 대각선 위에 위치해야 합니다. 예를 들어 입력이 다음과 같다면, 10
문제 이해하기 숫자로 이루어진 리스트 nums와 정수 k가 주어질 때, 최소 k개의 홀수를 포함하는 가장 긴 증가 부분 수열의 길이를 구해야 합니다. 예를 들어 입력이 다음과 같다고 가정해 보겠습니다. nums = [12, 14, 16, 5, 7, 8] k = 2 홀수가 2개 이상 포함된 가장 긴 증가 부분 수열은 [5, 7, 8]이므로, 출력 결과는 3이 됩니다. 풀이 접근법 이 문제는 재귀 호출을 활용한 동적 프로그래밍(DP) 방식으로 해결할 수 있습니다. 핵심 아이디어는 각 위치에서 현재 숫자를 부분 수열에 포함하거나 건
문제 개요N개의 양수로 이루어진 리스트 nums가 있다고 가정해 보겠습니다. 이때 우리는 리스트에서 임의의 값을 하나 골라 다른 위치로 이동(교환이 아니라 이동)할 수 있으며, 아예 아무것도 이동하지 않아도 됩니다. 목표는 리스트의 최종 파워(power)가 가장 커지도록 만드는 것입니다.여기서 리스트의 파워란 모든 인덱스 i에 대해 (인덱스 + 1) × 해당 위치의 값의 합으로 정의됩니다.$$\displaystyle\sum\limits_{i=0}^{n-1} (i+1)\times list[i]$$예를 들어 입력이 nums = [6,
문제 정의 N개의 울타리를 K가지 서로 다른 색상으로 칠한다고 가정해 보겠습니다. 단, 인접한 두 울타리는 반드시 다른 색이어야 하며, 전체 비용은 최소화해야 합니다. N×K 크기의 행렬에서 n번째 행, k번째 열의 값은 n번째 울타리를 k번째 색으로 칠할 때 드는 비용을 나타냅니다. 목표는 이 조건을 만족하는 최소 총비용을 구하는 것입니다. 예를 들어 입력이 다음과 같다고 해보겠습니다. 645327345544 이 경우 출력은 14입니다. 첫 번째 울타리부터 차례대로 색상 인덱스 5 → 2 → 3 → 4를 선택하면 인접한 울타리가
문제 개요 2차원 이진 행렬과 하나의 값 k가 주어진 상황을 생각해 봅시다. 왼쪽 위(시작 셀)에서 출발하여 오른쪽 아래(도착 셀)까지 이동해야 하며, 한 번의 이동으로는 아래(D) 또는 오른쪽(R) 방향으로만 움직일 수 있습니다. 경로의 점수는 해당 경로가 지나가는 모든 셀의 값을 합한 것으로 정의됩니다. 우리가 구해야 할 것은 점수가 정확히 k가 되는 경로의 개수입니다. 가능한 경로의 수가 기하급수적으로 늘어날 수 있기 때문에, 결과는 10^9 + 7로 나눈 나머지를 반환해야 합니다. 입력 예시 001 101 010 K