n개의 정수로 이루어진 배열이 있다고 가정해 보겠습니다. 우리가 찾아야 할 것은 엄격하게 증가하는(strictly increasing) 부분 배열 중에서 합이 가장 큰 값입니다.예를 들어 배열이 [1, 2, 3, 2, 5, 1, 7]이라면 정답은 8입니다. 이 배열에는 다음과 같이 세 개의 엄격하게 증가하는 부분 배열이 존재합니다.{1, 2, 3} → 합 6{2, 5} → 합 7{1, 7} → 합 8이 중 최대 합을 가지는 부분 배열은 {1, 7}이며, 그 합은 8입니다.접근 방법이 문제를 해결하려면 두 가지 값을 동시에 추적해야
문제 개요 일직선 위에 N개의 스테이션이 놓여 있고, 각 스테이션은 음수가 아닌 고유의 방사 능력(radiation power)을 가지고 있다고 가정해 보겠습니다. 흥미로운 점은 각 스테이션이 자신의 방사 능력을 이용해 양옆의 인접 스테이션들을 증폭시킬 수 있다는 것입니다. 구체적인 규칙은 다음과 같습니다. 방사 능력이 R인 스테이션 i는 왼쪽에 있는 (i-1)번째 스테이션의 방사 능력을 R-1만큼, (i-2)번째 스테이션의 방사 능력을 R-2만큼 높입니다. 오른쪽 방향도 마찬가지로 (i+1)번째 스테이션을 R-1만큼, (i+2)
면적 A와 둘레 P가 주어졌을 때, 이 두 값을 만족하는 직육면체가 가질 수 있는 최대 부피를 구하는 방법을 알아보겠습니다. 예를 들어 둘레 P가 24이고 면적 A가 24일 때, 만들 수 있는 직육면체의 최대 부피는 8입니다.기본 공식 정리직육면체의 세 변을 각각 길이(length), 너비(breadth), 높이(depth)라고 할 때, 둘레·겉넓이·부피는 다음과 같이 정의됩니다.둘레: P = 4 × (길이 + 너비 + 높이)겉넓이: A = 2 × (길이×너비 + 너비×높이 + 길이×높이)부피: V = 길이 × 너비 × 높이최대 부
문제 개요무한히 뻗어 있는 수직선(-∞ ~ +∞) 위에서 0부터 출발하여 목표 지점(target)까지 이동하는 문제를 생각해 봅시다. 규칙은 간단합니다. i번째 이동에서는 정확히 i칸만큼 왼쪽 또는 오른쪽으로 움직일 수 있습니다. 이때 목표 지점에 도달하기 위해 필요한 최소 이동 횟수를 구하는 것이 과제입니다.예를 들어 목표가 2라고 가정해 보겠습니다. 이 경우 최소 3번의 이동이 필요합니다. 0 → 1, 1 → -1, 그리고 -1 → 2의 경로로 이동하면 되기 때문입니다.핵심 아이디어이 문제를 효율적으로 해결하기 위해 반드시 기억
로그에는 log(x × y) = log(x) + log(y)라는 중요한 성질이 있습니다. 이 성질을 활용하면 1부터 N까지의 모든 로그 값을 구하는 데 실제로 필요한 최소 로그 연산 횟수를 계산할 수 있습니다. 문제 이해하기 예를 들어 N이 6이라면 정답은 3입니다. 그 이유를 단계별로 살펴보겠습니다. log(1): 항상 0이므로 계산할 필요가 없어 무시합니다. log(2), log(3): 소수이므로 각각 직접 계산해야 합니다. (현재까지 2회) log(4): log(2) + log(2)로 표현할 수 있으므로, 이미 알고 있는
문제 정의원 위에 n개의 주유소가 배치되어 있고, 각 주유소에 대해 다음 두 가지 정보가 주어진다고 가정해 봅시다.각 주유소가 보유하고 있는 기름의 양현재 주유소에서 다음 주유소까지의 거리목표는 트럭이 모든 주유소를 지나며 원을 한 바퀴 완주할 수 있는 최초의 출발 지점을 구하는 것입니다. 단, 트럭은 기름 1리터로 거리 1단위를 이동할 수 있다고 가정합니다.예를 들어 4개의 주유소가 있고, 각 주유소의 (기름 양, 다음 주유소까지의 거리)가 [(4, 6), (6, 5), (7, 3), (4, 5)]라고 합시다. 이 경우 트럭이 원
어떤 수 N이 주어졌을 때, N을 어떤 수로 나누었을 때 결과가 완전제곱수가 되도록 하는 최소의 수를 구하는 문제를 살펴보겠습니다. 예를 들어 N = 50이라면 답은 2입니다. 50 ÷ 2 = 25이고, 25는 5²에 해당하는 완전제곱수이기 때문입니다. 문제 해결 접근법 어떤 수가 완전제곱수가 되려면 모든 소인수의 지수가 짝수여야 합니다. 즉, 서로 다른 소인수의 등장 횟수가 모두 짝수일 때 그 수는 완전제곱수입니다. 이 성질을 활용하면 다음 순서로 문제를 해결할 수 있습니다. N을 소인수분해합니다. 각 소인수의 지수(거듭제곱된
문제 개요n개의 요소로 구성된 배열이 있다고 가정해 보겠습니다. 이 배열에서 첫 번째, 두 번째, 세 번째 최솟값을 찾아야 합니다.여기서 각 용어의 의미는 다음과 같습니다.첫 번째 최솟값(first min): 배열 전체에서 가장 작은 값두 번째 최솟값(second min): 첫 번째 최솟값보다 큰 값들 중 가장 작은 값세 번째 최솟값(third min): 두 번째 최솟값보다 큰 값들 중 가장 작은 값접근 방법이 문제는 배열의 각 요소를 한 번씩 순회하면서, 현재 요소가 첫 번째·두 번째·세 번째 최솟값 조건에 해당하는지 검사하는 방
여러 개의 좌표 점과 하나의 정수 k가 주어졌을 때, 중심이 (0, 0)인 원이 최소한 k개의 점을 포함하도록 만드는 최소 반지름을 구하는 문제를 살펴보겠습니다.예를 들어, 점들이 (1, 1), (-1, -1), (1, -1)로 주어지고 k = 3이라면, 세 점을 모두 원 안에 넣기 위해 필요한 최소 반지름은 2가 됩니다.접근 방법이 문제의 핵심 아이디어는 매우 간단합니다.원의 중심이 항상 원점 (0, 0)에 고정되어 있으므로, 각 점과 원점 사이의 유클리드 거리만 계산하면 됩니다. 그런 다음 계산된 거리들을 오름차순으로 정렬하고,
문제 개요양의 정수로 이루어진 2차원 행렬이 주어졌을 때, 왼쪽 위 시작 칸 (0, 0)에서 오른쪽 아래 마지막 칸 (n-1, n-1)까지 이동하는 데 필요한 최소 단계 수를 구하는 문제입니다.현재 위치가 (i, j)인 경우, 다음 두 가지 방식으로만 이동할 수 있습니다.(i, j + mat[i][j]) : 현재 칸에 적힌 값만큼 오른쪽으로 이동(i + mat[i][j], j) : 현재 칸에 적힌 값만큼 아래쪽으로 이동단, 행렬의 경계를 벗어나는 이동은 허용되지 않습니다.예시 행렬212111111위 행렬의 경우 정답은 2입니다. 실
이 문제에서는 팩토리얼(factorial)이 주어진 수 x로 나누어 떨어지는 첫 번째 자연수를 찾아야 합니다. 사용자로부터 x 값을 입력받으며, 조건을 만족하는 가장 작은 자연수 N을 구하는 것이 목표입니다.예를 들어 x = 16이라고 가정해 보겠습니다. 이때 정답은 6입니다. 그 이유는 6! = 720이고, 720 mod 16 = 0이기 때문입니다. 즉, 6!은 16으로 나누어 떨어지며, 그보다 작은 수의 팩토리얼(1! ~ 5!)은 16으로 나누어 떨어지지 않습니다.접근 방법가장 일반적인 방법은 다음과 같습니다.1부터 시작하여 1
문제 개요 이진 트리와 값 K가 주어졌을 때, 수직 순회(vertical order traversal) 결과에서 K번째 노드를 찾아 출력하는 것이 이 글의 목표입니다. 만약 해당 위치의 노드가 존재하지 않는다면 -1을 반환해야 합니다. 예를 들어 다음과 같은 이진 트리가 있다고 가정해 보겠습니다. 이 트리를 수직 순회하면 노드는 아래와 같은 순서로 방문됩니다. 4 2 1 5 6 3 8 7 9 위 순서에서 K = 3이라면, 세 번째 위치에 있는 노드는 1이므로 결과값은 1이 됩니다. 접근 방법 풀이 방식은 비교적 간단합니다. 먼저
서로 다른 N개의 정수로 이루어진 배열이 있다고 가정해 봅시다. 이때 주어진 N개의 정수 중 정확히 하나만 포함하면서, 1 ≤ L ≤ R ≤ 105 조건을 만족하는 구간 [L, R] 중 길이가 가장 긴 구간을 찾아야 합니다.예를 들어 배열이 Arr = [5, 10, 200]이라면 출력값은 99990입니다. 가능한 모든 구간은 [1, 9], [6, 199], [11, 100000]이며, 이 중 마지막 구간이 99990개의 정수를 포함하여 가장 깁니다.접근 방법핵심 아이디어는 간단합니다. 먼저 구간에 포함시킬 기준 원소를 하나 고정한
문제 개요두 양의 정수 n과 k가 주어졌을 때, 다음 조건을 만족하는 양의 정수 x를 찾는 것이 목표입니다.(x % k) × (x / k) == n예를 들어 n = 4, k = 6이라고 가정해 보겠습니다. 이때 정답은 10입니다. 실제로 계산해 보면 (10 % 6) × (10 / 6) = 4 × 1 = 4로, 주어진 조건을 정확히 만족하며 그보다 작은 x로는 조건을 충족할 수 없습니다.접근 방법이 문제의 핵심은 나머지 연산의 성질을 활용하는 것입니다. 어떤 수 x를 k로 나눈 나머지를 r이라 하면, x는 다음과 같이 표현할 수 있습
자릿수(digit)로 이루어진 배열이 하나 주어져 있다고 가정해 봅시다. 이 배열의 모든 자릿수를 한 번씩 사용하여 만들 수 있는 최댓값을 찾아야 합니다. 예를 들어 배열이 [3, 3, 9, 6, 2, 5]라면, 만들 수 있는 최대 수는 965332입니다. 접근 방법 이 문제는 자릿수를 내림차순으로 정렬한 뒤 차례대로 이어 붙이면 간단히 해결할 수 있습니다. 하지만 정렬 대신 더 효율적인 방법을 사용할 수 있습니다. 핵심 아이디어는 크기가 10인 빈도(frequency) 배열을 활용하는 것입니다. 입력 배열을 한 번 순회하면서 각
문자열 str이 주어졌을 때, 이 문자열에서 마지막으로 반복되지 않는(non-repeating) 문자를 찾는 문제입니다. 예를 들어 입력 문자열이 programming이라면, 뒤에서부터 살펴볼 때 가장 먼저 발견되는 중복 없는 문자는 n입니다. 만약 조건을 만족하는 문자가 하나도 없다면 -1을 반환해야 합니다.해결 접근 방법이 문제는 빈도(frequency) 배열 하나만 있으면 간단하게 해결할 수 있습니다.먼저 길이 256의 정수 배열을 선언하여 문자열에 등장하는 각 문자의 출현 횟수를 저장합니다. 아스키(ASCII) 코드 기준으로
두 개의 양의 정수 n과 k가 주어졌을 때, 숫자 k를 포함하거나 k로 나누어 떨어지는 수들 중 n번째 수를 찾는 것이 이 글의 목표입니다. 단, k의 범위는 2부터 9 사이로 제한됩니다.예를 들어 n이 15이고 k가 3이라면 결과값은 33입니다. 그 이유는 [3, 6, 9, 12, 13, 15, 18, 21, 23, 24, 27, 30, 31, 33]처럼 각 숫자가 자릿수에 3을 포함하거나 3으로 나누어 떨어지는 수들이며, 이 중 15번째 수가 바로 33이기 때문입니다.문제 해결 접근 방법가장 직관적인 방법은 다음과 같습니다.1부
함수 F(n) = P − (0.006 × n)이 정의되어 있고, 여기서 P 역시 주어진 값이라고 가정해 봅시다. 이때 정수로 이루어진 목록과 하나의 숫자 A가 주어졌을 때, 목록에 있는 수 중에서 함수 값이 A에 가장 가까운 수를 찾는 것이 문제입니다.예를 들어 P = 12, A = 5이고 목록이 {1000, 2000}이라면 출력 결과는 1000입니다. 그 이유는 다음과 같습니다.F(1000) = 12 − (0.006 × 1000) = 6F(2000) = 12 − (0.006 × 2000) = 0A인 5와 비교했을 때 6이 0보다
두 개의 문자열 str1과 str2가 주어졌다고 가정해 봅시다. 두 번째 문자열(str2)에 0회 이상의 연산을 수행한 뒤, 두 문자열 사이에서 가장 긴 공통 접두사(longest common prefix)를 찾는 것이 목표입니다. 여기서 각 연산은 str2 내에서 임의의 두 문자를 서로 맞바꾸는 것입니다.예를 들어 str1 = HERE, str2 = THERE인 경우를 살펴보겠습니다. str2의 문자들을 적절히 교환하여 HERET으로 만들면, 두 문자열의 공통 접두사 길이는 4가 됩니다.접근 방법문자 교환은 오직 str2에서만 가
하나의 행렬이 주어졌다고 가정해 보겠습니다. 우리가 구해야 할 것은 이 행렬 안에 있는 캐비티(cavity)의 개수입니다. 캐비티란 특정 요소를 둘러싸고 있는 모든 인접 요소들이 그 요소보다 큰 값을 가질 때 해당 요소를 가리키는 용어입니다.예를 들어 다음과 같은 행렬이 있다고 합시다.456715456정중앙에 있는 값 1은 상·하·좌·우와 네 대각선 방향의 모든 이웃 요소(4, 5, 6, 7)보다 작기 때문에 캐비티에 해당합니다. 따라서 이 행렬에 대한 출력 결과는 1입니다.알고리즘 접근 방식핵심 아이디어는 매우 단순합니다. 각 요