문제 개요배열 arr와 정수 target이 주어졌을 때, 각각의 원소 합이 정확히 target이 되면서 서로 겹치지 않는 두 개의 부분 배열(연속된 하위 배열)을 찾아야 합니다. 조건을 만족하는 답이 여러 개라면, 두 부분 배열 길이의 합이 가장 작은 경우를 선택해야 하며 그 최솟값을 반환합니다. 만약 조건을 만족하는 부분 배열이 하나도 없다면 -1을 반환합니다.예를 들어 입력이 arr = [5,2,6,3,2,5], target = 5라고 해 보겠습니다. 합이 5가 되는 부분 배열은 [5], [3,2], [5]로 세 가지가 있습니다
정수로만 이루어진 배열 nums와 숫자 k가 주어졌다고 가정해 봅시다. 우리가 해야 할 일은 정확히 k개의 요소를 제거한 후 남아 있는 고유(unique) 요소의 최소 개수를 찾는 것입니다.문제 이해하기예를 들어 입력이 다음과 같다면,nums = [5, 4, 2, 2, 4, 4, 3]k = 3출력은 2가 됩니다. 그 이유는 5와 3을 제거하고, 2 또는 4 중 하나를 추가로 제거하면 배열에는 2와 4 두 종류의 값만 남기 때문입니다.접근 방법: 그리디(Greedy) 전략고유 요소의 개수를 최대한 줄이려면 등장 빈도가 낮은 숫자부터
정수로 이루어진 배열 nums와 두 개의 값 m, k가 있다고 가정해 봅시다. 우리는 정원에서 꽃다발 m개를 만들어야 하고, 꽃다발 하나를 만들려면 인접한(연속된) 꽃 k송이가 필요합니다. 정원에는 서로 다른 꽃 n송이가 있으며, i번째 꽃은 bloomDay[i]번째 날에 핍니다. 각 꽃은 단 하나의 꽃다발에만 사용할 수 있습니다. 이때 꽃다발 m개를 완성하기 위해 기다려야 하는 최소 일수를 구하고, 만드는 것이 불가능하다면 -1을 반환해야 합니다. 예시 bloomDay = [5,5,5,5,10,5,5], m = 2, k = 3이라
n개의 문자열로 이루어진 배열 names가 있다고 가정해 보겠습니다. 우리는 파일 시스템에 n개의 디렉터리를 만들어야 하며, i번째 단계에서 names[i]라는 이름의 디렉터리를 생성합니다. 두 파일은 동일한 이름을 가질 수 없기 때문에, 중복된 디렉터리 이름을 입력하면 시스템은 자동으로 이름 뒤에 (k) 형태의 접미사를 붙입니다. 여기서 k는 해당 이름이 고유해지는 가장 작은 양의 정수입니다. 최종적으로 길이가 n인 문자열 배열 ans를 구해야 하며, ans[i]는 i번째 디렉터리가 생성될 때 실제로 할당되는 이름이 됩니다.예를
문제 설명 두 개의 양수 n과 k가 주어집니다. n의 모든 약수를 오름차순으로 정렬한 목록에서 k번째 약수를 찾아야 하며, 만약 n의 약수 개수가 k보다 적다면 -1을 반환해야 합니다. 예를 들어 n = 28, k = 4라고 가정해 보겠습니다. 28의 약수는 [1, 2, 4, 7, 14, 28]이고, 이 중 네 번째 약수는 7이므로 결과값은 7이 됩니다. 접근 방법 모든 수를 일일이 확인하는 대신, 제곱근까지만 탐색하면 효율적으로 문제를 해결할 수 있습니다. 약수는 항상 쌍(pair)으로 존재하기 때문입니다. 즉, i가 n의 약수
문제 이해하기0과 1로만 이루어진 이진 배열 nums가 주어지고, 배열에서 딱 한 개의 요소를 삭제할 수 있다고 가정해 보겠습니다. 이때 남은 배열에서 1로만 구성된 가장 긴 비어 있지 않은 연속 부분 배열(subarray)의 길이를 구하는 것이 목표입니다. 조건을 만족하는 부분 배열이 존재하지 않는다면 0을 반환합니다.예를 들어 입력이 nums = [1,0,1,1,1,0,1,1,0]이라면 정답은 5입니다. 인덱스 5에 있는 0을 삭제하면 [1,1,1,1,1]이라는 다섯 개의 1이 연속된 구간을 얻을 수 있기 때문입니다.알고리즘 접
문제 설명nums라는 배열이 있고, 이 배열에는 짝수 개의 요소가 들어 있으며, 또 다른 값 k가 주어진다고 가정해 보겠습니다. 우리는 nums를 정확히 n/2개의 쌍으로 나누어 각 쌍의 합이 k로 나누어떨어지도록 만들어야 합니다. 가능하다면 true를, 그렇지 않다면 false를 반환합니다.예를 들어, 입력이 nums = [9,5,3,4,7,10,20,8], k = 3이라면 출력은 True입니다. (9,3), (5,7), (4,20), (8,10)과 같은 쌍을 만들 수 있고, 각 쌍의 합인 12, 12, 24, 18이 모두 3으로
배열 nums와 정수 k가 주어졌다고 가정해 봅시다. 이때 nums의 비어 있지 않은 모든 부분 수열(subsequence) 중에서, 그 수열 안의 최솟값과 최댓값의 합이 k 이하가 되는 경우의 수를 구하는 것이 목표입니다. 답이 매우 커질 수 있으므로 결과는 109 + 7로 나눈 나머지를 반환해야 합니다. 문제 이해하기 예를 들어 입력이 nums = [4, 6, 7, 8], k = 11이라면 출력은 4입니다. 조건을 만족하는 부분 수열은 다음과 같습니다. [4] — 최솟값 4, 최댓값 4 → 4 + 4 ≤ 11 ✓ [4, 6]
m × n 크기의 이진 행렬(0과 1로만 이루어진 행렬)이 주어졌을 때, 모든 요소가 1로 채워져 있는 정사각형 부분 행렬이 몇 개나 있는지 구하는 문제입니다.문제 예시다음과 같은 행렬이 입력으로 주어졌다고 가정해 보겠습니다.011111110111이 경우 출력은 15가 됩니다. 그 이유는 다음과 같습니다.한 변의 길이가 1인 정사각형: 10개한 변의 길이가 2인 정사각형: 4개한 변의 길이가 3인 정사각형: 1개따라서 전체 정사각형의 개수는 10 + 4 + 1 = 15개입니다.해결 접근 방법 (동적 계획법)이 문제는 동적 계획법(D
이 문제에서는 m × n 크기의 이진 행렬(binary matrix)이 주어졌을 때, 모든 원소가 1인 부분 행렬(submatrix)이 총 몇 개 존재하는지 구해야 합니다.예를 들어 입력 행렬이 다음과 같다고 가정해 보겠습니다.101011011이 경우 출력은 13입니다. 크기별로 살펴보면 1×1 부분 행렬 6개, 2×1 부분 행렬 3개, 1×2 부분 행렬 2개, 3×1 부분 행렬 1개, 그리고 2×2 부분 행렬 1개가 존재하여 전체 13개가 됩니다.문제 해결 접근 방법이 문제는 동적 계획법(Dynamic Programming)을 활
양의 정수로 이루어진 길이 n의 배열 nums가 있다고 가정해 보겠습니다. 이 배열의 모든 비어 있지 않은 연속된 하위 배열(부분 배열)의 합을 계산한 뒤, 이 값들을 오름차순으로 정렬하면 총 n*(n+1)/2개의 숫자로 이루어진 새로운 배열이 만들어집니다. 우리가 해야 할 일은 이 새로운 배열에서 인덱스 left부터 right까지(1부터 시작하는 인덱스, 양 끝 포함)에 해당하는 숫자들의 합을 구하는 것입니다.결과값이 매우 커질 수 있으므로, 최종 답은 10^9 + 7로 나눈 나머지를 반환해야 합니다.예시예를 들어 입력이 nums
문제 개요nums라는 배열이 하나 주어져 있다고 가정해 봅시다. 한 번의 이동(move)마다 배열의 원소 하나를 임의의 값으로 변경할 수 있으며, 최대 3번의 이동을 수행한 뒤 배열에서 가장 큰 값(최댓값)과 가장 작은 값(최솟값)의 차이를 최소화해야 합니다.예를 들어 입력이 nums = [3,7,2,12,16]이라면 결과는 1입니다. 배열을 [1,1,0,1,1] 형태로 바꾸면 최댓값은 1, 최솟값은 0이 되어 차이가 1이 되기 때문입니다.접근 방법배열의 길이가 4 이하라면 모든 원소를 같은 값으로 맞출 수 있으므로 차이는 항상 0
이진 문자열(binary string) s가 주어졌을 때, 모든 문자가 1로만 이루어진 부분 문자열(substring)의 개수를 구하는 문제입니다. 답이 매우 커질 수 있기 때문에 결과는 10^9 + 7로 나눈 나머지(modulo)를 반환해야 합니다.예를 들어 입력이 s = 1011010이라면 출력은 5가 됩니다. 그 이유는 다음과 같습니다.1 → 4번 등장11 → 1번 등장문제 해결 접근 방법핵심 아이디어는 간단합니다. 문자열을 0을 기준으로 분할하면, 연속된 1로만 이루어진 덩어리(블록)들이 남게 됩니다. 길이가 n인 연속된 1
문제 개요 노드가 n개인 무방향 가중치 그래프가 주어진다고 가정해 봅시다(노드는 0부터 번호가 매겨집니다). 그래프는 간선 리스트 형태로 입력되며, 각 간선 e마다 해당 간선을 통과할 때의 성공 확률인 probability[e]가 함께 제공됩니다. 또한 시작 노드와 끝 노드도 주어지는데, 우리의 목표는 시작 노드에서 끝 노드까지 이동하는 경로 중 성공 확률이 가장 높은 경로를 찾아 그 확률값을 반환하는 것입니다. 만약 어떤 경로도 존재하지 않는다면 0을 반환하면 됩니다. 예를 들어 입력이 다음과 같다고 해보겠습니다. 이 경우 출
노드가 n개인 루트가 있는 일반 트리가 있다고 가정해 보겠습니다. 노드는 0부터 n-1까지 번호가 매겨져 있으며, 각 노드에는 소문자 영어 알파벳 하나로 이루어진 레이블이 붙어 있습니다. 레이블은 labels 배열로 입력되며, labels[i]는 i번째 노드의 레이블을 담고 있습니다. 트리는 간선 목록으로 표현되는데, 각 간선 e의 [u, v]는 u가 부모이고 v가 자식임을 의미합니다.우리가 구해야 할 것은 크기가 n인 배열 A입니다. 여기서 A[i]에는 i번째 노드와 같은 레이블을 가진 노드 중에서 i번째 노드의 하위 트리(sub
문제 이해하기 배열 arr가 주어졌을 때, 원소들의 합이 홀수가 되는 부분 배열(연속된 하위 배열)의 개수를 구하는 문제입니다. 만약 답이 너무 커진다면 결과를 10^9+7로 나눈 나머지를 반환하면 됩니다. 예를 들어 입력이 arr = [8,3,7]이라고 가정해 보겠습니다. 만들 수 있는 모든 부분 배열은 [[8], [3], [7], [8,3], [3,7], [8,3,7]]의 여섯 가지이며, 각각의 합은 순서대로 [8, 3, 7, 11, 10, 18]입니다. 이 중 합이 홀수인 경우는 3, 7, 11의 세 가지이므로 정답은 3이 됩
문제 설명문자열 s가 하나 주어져 있다고 가정해 봅시다. s를 두 개의 비어 있지 않은 문자열 p와 q로 나누었을 때, p와 q를 이어 붙이면 다시 원래의 s가 되고, 동시에 p와 q에 포함된 서로 다른 문자(고유 문자)의 개수가 같다면, 이 분할을 좋은 분할(good split)이라고 합니다.우리가 구해야 할 것은 문자열 s에서 만들 수 있는 좋은 분할의 총 개수입니다.예를 들어 입력이 s = xxzxyx라면 출력은 2가 됩니다. 문자열을 나눌 수 있는 위치는 여러 곳이 있지만, (xxz, xyx) 또는 (xxzx, yx)처럼 나
방에 n개의 전구가 있다고 가정해 보겠습니다. 전구들은 0부터 n-1까지 번호가 매겨져 있으며, 왼쪽에서 오른쪽으로 한 줄로 배치되어 있습니다. 처음에는 모든 전구가 꺼져 있는 상태(0)입니다. 우리의 목표는 주어진 목표 배열 t로 표현되는 구성을 만드는 것입니다. 여기서 t[i]는 i번째 전구가 켜져 있으면 1, 꺼져 있으면 0을 의미합니다. 또한 전구의 상태를 반전시키는 스위치가 하나 있으며, 플립(flip) 연산은 다음과 같이 정의됩니다. 임의의 전구 인덱스 i를 선택합니다. 인덱스 i부터 n-1까지의 모든 전구 상태를 반전
문제 설명이진 트리와 거리 값 d가 하나 주어집니다. 서로 다른 두 리프(잎) 노드로 이루어진 쌍은, 두 노드 사이의 최단 경로 길이가 d보다 작거나 같을 때 좋은(good) 쌍으로 정의됩니다.예를 들어 아래와 같은 이진 트리가 있다고 가정해 보겠습니다.이때 거리 d = 4라면 정답은 2입니다. 그 이유는 (8, 7)과 (5, 6) 두 쌍의 경로 길이가 각각 2로 조건을 만족하지만, (7, 5)나 (8, 6) 같은 나머지 쌍들은 경로 길이가 5로 d = 4보다 크기 때문에 좋은 쌍이 될 수 없습니다.해결 접근 방법이 문제는 후위 순
문제 개요 서로 다른 고유한 원소로 이루어진 배열 arr와 정수 k가 주어져 있다고 가정해 보겠습니다. 이제 다음 규칙을 따르는 간단한 게임을 생각할 수 있습니다. 매 라운드마다 배열의 첫 두 원소인 arr[0]과 arr[1]을 비교합니다. 더 큰 값이 승리하여 0번째 자리에 그대로 남고, 작은 값은 배열의 맨 끝으로 이동합니다. 어떤 값이 k번 연속으로 승리하면 게임이 종료되며, 그 값이 최종 승자가 됩니다. 예를 들어 입력이 arr = [1,5,6,3,4,2], k = 3이라면 출력은 6이 됩니다. 라운드별 진행 과정은 다음