문제 개요 각 작업에는 두 가지 정보가 주어집니다. difficulty[i]는 i번째 작업의 난이도를 나타내고, profit[i]는 해당 작업을 완료했을 때 얻는 수익을 나타냅니다. 또한 여러 명의 작업자가 있으며, worker[i]는 i번째 작업자의 능력을 의미합니다. 즉, 이 작업자는 난이도가 worker[i] 이하인 작업만 수행할 수 있습니다. 여기서 중요한 조건은 다음과 같습니다. 각 작업자는 최대 한 개의 작업만 맡을 수 있습니다. 하지만 하나의 작업은 여러 작업자가 중복해서 수행할 수 있습니다. 목표는 작업자들에게 작
문제 개요주식의 일별 시세를 수집하고, 당일 주가의 스팬(span)을 반환하는 API를 만든다고 가정해 봅시다. 여기서 오늘의 주가 스팬은 다음과 같이 정의됩니다.오늘부터 거슬러 올라가며, 주가가 오늘의 가격보다 작거나 같았던 연속된 날짜 수의 최댓값예를 들어 7일간의 주가 기록이 [100, 80, 60, 70, 60, 75, 85]라면, 각 날짜의 스팬은 [1, 1, 1, 2, 1, 4, 6]이 됩니다. 이번 글에서는 이러한 동작을 수행하는 실제 모듈을 C++로 직접 구현해 보겠습니다.접근 방법: 스택 활용하기이 문제는 스택(st
문제 설명나무들이 한 줄로 늘어서 있고, i번째 나무는 tree[i]라는 종류의 과일을 생산한다고 가정해 봅시다. 우리는 원하는 나무 아무 곳에서나 시작해 다음 단계를 반복해서 수행할 수 있습니다.현재 나무에서 과일 하나를 바구니에 담습니다. 더 이상 담을 수 없으면 중단합니다.오른쪽에 있는 다음 나무로 이동합니다. 오른쪽에 나무가 더 없으면 중단합니다.바구니는 총 두 개이며, 각 바구니에는 어떤 종류의 과일이든 원하는 만큼 담을 수 있습니다. 단, 각 바구니에는 한 가지 종류의 과일만 담아야 한다는 제약이 있습니다. 목표는 이 규
정수로 이루어진 정사각형 배열 A가 주어졌을 때, A를 통과하는 낙하 경로(falling path) 중 합이 가장 작은 경로를 찾는 것이 이 문제의 목표입니다. 낙하 경로란 첫 번째 행의 임의의 원소에서 시작하여, 각 행마다 하나의 원소를 선택하며 아래로 내려가는 경로를 의미합니다. 단, 다음 행에서 선택하는 원소의 열은 바로 위 행에서 선택한 열과 최대 1칸까지만 차이가 나야 한다는 제약 조건이 있습니다.문제 예시다음과 같은 3x3 행렬이 주어졌다고 가정해 보겠습니다.123456789이 경우 정답은 12입니다. 가능한 낙하 경로는
정수로 이루어진 배열 A가 주어졌을 때, 원소들의 합이 k로 나누어 떨어지는 연속된 비어 있지 않은 부분 배열의 개수를 구하는 문제입니다. 예를 들어 A = [4, 5, 0, -2, -3, 1]이고 k = 5라고 가정해 보겠습니다. 이 경우 정답은 7이며, 조건을 만족하는 부분 배열은 다음과 같습니다. [4, 5, 0, -2, -3, 1] [5] [5, 0] [5, 0, -2, -3] [0] [0, -2, -3] [-2, -3] 접근 방법: 누적 합과 나머지 연산 이 문제는 누적 합(prefix sum)과 나머지(modulo)
문제 소개 0과 1로만 이루어진 배열 A가 주어지고, 최대 K개의 값을 0에서 1로 바꿀 수 있다고 가정해 보겠습니다. 이때 1만으로 구성된 가장 긴 연속(contiguous) 부분 배열의 길이를 구하는 것이 목표입니다. 예를 들어 A = [1,1,1,0,0,0,1,1,1,1,0]이고 k = 2라면 정답은 6이 됩니다. 두 개의 0을 1로 뒤집으면 배열이 [1,1,1,0,0,1,1,1,1,1,1] 형태가 되어, 가장 긴 1의 연속 구간 길이가 6이기 때문입니다. 해결 접근 방식: 슬라이딩 윈도우(Sliding Window) 이 문제
등차 수열(arithmetic sequence)이란 최소 세 개 이상의 요소로 구성되어 있고, 인접한 두 요소 간의 차이가 모두 동일한 수열을 의미합니다. 예를 들어 [1, 3, 5, 7, 9], [7, 7, 7, 7], [3, -1, -5, -9]는 모두 등차 수열입니다. 반면 [1, 1, 2, 5, 7]처럼 요소 간 차이가 일정하지 않은 수열은 등차 수열이 아닙니다.이번 문제에서는 N개의 숫자로 이루어진 0-인덱스 배열 A가 주어집니다. 배열의 슬라이스(slice)란 0 ≤ P < Q < N을 만족하는 정수 쌍 (P,
앨리스와 밥 두 사람이 한 줄로 놓인 돌 무더기를 가지고 게임을 계속 이어가고 있습니다. 각 무더기에는 양의 정수 개수의 돌이 들어 있으며, 배열 piles[i]로 표현됩니다. 게임의 목표는 가능한 한 많은 돌을 확보하는 것입니다. 앨리스와 밥은 번갈아 가며 차례를 진행하며, 항상 앨리스가 먼저 시작합니다. 초기값은 M = 1입니다.각 플레이어는 자신의 차례에 남아 있는 첫 번째 X개의 무더기에 있는 모든 돌을 가져갈 수 있으며, 이때 1 <= X <= 2M 조건을 만족해야 합니다. 그런 다음 M = max(M, X)로
문제 설명문자열 s가 주어졌을 때, k 중복 제거는 문자열에서 인접하면서 서로 같은 문자 k개를 선택하여 삭제하는 연산을 의미합니다. 삭제된 부분 문자열의 왼쪽과 오른쪽은 자동으로 이어 붙여집니다. 이러한 k 중복 제거를 더 이상 문자열을 변경할 수 없을 때까지 반복 수행한 뒤, 최종 결과 문자열을 구하는 것이 목표입니다.예를 들어 s = deeedbbcccbdaa, k = 3이라고 가정해 보겠습니다.먼저 eee와 ccc를 삭제하면 → ddbbbaa다음으로 bbb를 삭제하면 → dddaa마지막으로 ddd를 삭제하면 → aa따라서 최
문제 설명두 정수 low와 high가 주어졌을 때, [low, high] 범위(양 끝값 포함)에 속한 모든 스테핑 숫자(Stepping Number)를 찾아 오름차순으로 정렬된 리스트 형태로 출력해야 합니다.스테핑 숫자란 인접한 두 자릿수의 절댓값 차이가 정확히 1인 정수를 의미합니다. 예를 들어 321은 3→2, 2→1로 인접 자릿수가 각각 1씩 차이 나므로 스테핑 숫자이지만, 421은 4→2가 2만큼 차이 나므로 해당되지 않습니다.따라서 low = 0, high = 21이 입력으로 주어지면 결과는 다음과 같습니다.[0, 1, 2
m × n 크기의 금광 그리드가 있다고 가정해 봅시다. 이 광산의 각 칸에는 그 칸에 들어 있는 금의 양을 나타내는 정수가 저장되어 있으며, 값이 0이면 빈 칸을 의미합니다. 우리의 목표는 다음 조건을 지키면서 수집할 수 있는 최대 금의 양을 구하는 것입니다.문제 조건칸에 도착할 때마다 해당 칸에 있는 모든 금을 수집합니다.현재 위치에서 한 번에 한 칸씩 왼쪽, 오른쪽, 위, 아래로만 이동할 수 있습니다.같은 칸을 두 번 이상 방문할 수 없습니다.금이 0인 칸은 절대 방문하지 않습니다.예를 들어 입력이 [[0,6,0],[5,8,7]
문제 개요주사위 시뮬레이터가 매번 굴릴 때마다 1부터 6 사이의 난수를 생성한다고 가정해 봅시다. 여기에 하나의 제약 조건을 추가하려고 합니다. 바로 어떤 숫자 i든 연속해서 rollMax[i]번(1-인덱스 기준)을 초과하여 나올 수 없도록 하는 것입니다. 정수 배열 rollMax와 정수 n이 주어질 때, 정확히 n번 굴려서 얻을 수 있는 서로 다른 수열의 개수를 반환해야 합니다. 두 수열은 적어도 하나의 원소가 서로 다를 때 다른 수열로 간주됩니다.예를 들어 n = 2이고 rollMax = [1,1,2,2,2,3]이라면 출력은 3
문제 개요두 사람의 가용 시간대 목록 slots1과 slots2, 그리고 회의 길이 d가 주어졌을 때, 두 사람 모두 참석할 수 있으면서 길이가 d 이상인 가장 빠른 시간대를 찾아야 합니다. 만약 조건을 만족하는 공통 시간대가 존재하지 않는다면 빈 배열을 반환합니다.시간대는 [start, end] 형태의 두 원소를 가진 배열로 표현되며, start부터 end까지의 포함 범위를 나타냅니다. 또한 동일한 사람의 가용 시간대끼리는 서로 겹치지 않는다고 가정합니다. 즉, 같은 사람의 임의의 두 시간대 [s1, e1]과 [s2, e2]에 대
문제 설명 여러 개의 동전이 있다고 가정해 봅시다. i번째 동전을 던졌을 때 앞면이 나올 확률은 prob[i]입니다. 우리가 구해야 하는 것은 모든 동전을 정확히 한 번씩 던졌을 때, 앞면이 나온 동전의 개수가 target과 일치할 확률입니다. 예를 들어 prob 배열이 [0.5, 0.5, 0.5, 0.5, 0.5]이고 target이 0이라면, 다섯 개의 동전이 모두 뒷면이 나올 확률인 0.03125가 출력됩니다. 접근 방법 이 문제는 동적 계획법(Dynamic Programming)으로 효율적으로 해결할 수 있습니다. dp[i]
폴더 경로 목록이 주어졌을 때, 다른 폴더에 포함된 모든 하위 폴더(sub-folder)를 제거하고 남은 폴더들을 임의의 순서로 반환하는 문제입니다. 여기서 folder[i]가 다른 folder[j] 내부에 위치한다면, folder[i]는 folder[j]의 하위 폴더로 간주됩니다. 경로는 /folder1/subfolder2/... 와 같은 형태로 표현됩니다.문제 예시입력이 다음과 같다고 가정해 보겠습니다.[/myfolder, /myfolder/secondfolder, /another/document, /another/documen
2차원 행렬 matrix가 주어졌을 때, 왼쪽 위 모서리 좌표 (row1, col1)과 오른쪽 아래 모서리 좌표 (row2, col2)로 정의되는 직사각형 영역 내부에 있는 모든 요소의 합을 구하는 문제입니다.예를 들어 행렬이 다음과 같다고 가정해 보겠습니다.3014256321120154101710305위 표에서 파란색으로 표시된 영역은 (2,1)과 (4,3)으로 정의된 직사각형이며, 이 영역의 합은 8입니다.따라서 sumRegion(2, 1, 4, 3), sumRegion(1, 1, 2, 2), sumRegion(1, 2, 2,
정수 n이 주어졌을 때, 1부터 n까지의 모든 숫자를 사전식(lexicographic) 순서로 반환하는 것이 이 글의 목표입니다. 예를 들어 n = 13이 주어지면 출력은 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9]가 됩니다. 사전식 순서란 숫자를 문자열처럼 비교하여 정렬하는 방식이므로, 일반적인 수치 오름차순 정렬과는 전혀 다른 결과가 나옵니다. 알고리즘 접근 방법 이 문제는 다음 단계를 따라 해결할 수 있습니다. 크기가 n인 배열 ret을 정의합니다. curr := 1로 초기화합니다. i를
DNA 서열이 주어졌을 때, 그 안에서 반복적으로 나타나는 10글자 길이의 부분 문자열(substring)을 모두 찾는 문제를 풀어보겠습니다. DNA는 A(아데닌), C(시토신), G(구아닌), T(티민)라는 네 가지 뉴클레오타이드의 연속으로 구성됩니다. 예를 들어 ACGAATTCCG와 같은 형태죠. DNA를 연구할 때 특정 서열이 여러 번 등장하는지 확인하는 것은 매우 유용한 분석 방법입니다.문제 정의주어진 DNA 분자에서 10글자 길이의 서열 중 두 번 이상 나타나는 것을 모두 찾아야 합니다.예를 들어 입력이 다음과 같다면:AA
범위 [m, n]이 주어졌을 때(단, 0 ≤ m ≤ n ≤ 2147483647), 이 범위에 포함된 모든 숫자의 비트 AND(bitwise AND) 연산 결과를 구하는 문제입니다. 예를 들어 범위가 [5, 7]이라면, 5 AND 6 AND 7의 결과는 4가 됩니다.문제 접근 방법범위 내 모든 숫자를 하나씩 AND 연산하면 시간이 오래 걸릴 수 있습니다. 대신 다음과 같은 효율적인 방법을 사용할 수 있습니다.카운터 변수 i를 0으로 초기화합니다.m과 n이 같아질 때까지 두 값을 각각 오른쪽으로 1비트씩 시프트하고, 그때마다 i를 1씩
문제 소개 정수 배열이 주어졌을 때, 배열 안에 서로 다른 두 인덱스 i와 j가 존재하는지 확인하는 문제입니다. 이때 만족해야 할 조건은 다음과 같습니다. nums[i]와 nums[j]의 절댓값 차이는 t 이하여야 합니다. 인덱스 i와 j의 절댓값 차이는 k 이하여야 합니다. 예를 들어 입력 배열이 [1,2,3,1]이고 k = 3, t = 0이라면, 조건을 만족하는 두 수가 존재하므로 결과는 true(1)가 됩니다. 해결 접근 방식 이 문제는 슬라이딩 윈도우(sliding window) 기법과 multiset을 함께 활용하면 효