배열 arr[n]에 n개의 소수가 저장되어 있고 정수 k가 주어졌을 때, 배열에서 매 k번째 소수의 곱을 구하는 것이 이 글의 목표입니다.예를 들어 배열이 arr[] = {3, 5, 7, 11}이고 k = 2라고 가정해 보겠습니다. 이 경우 매 2번째 소수인 5와 11을 곱한 값, 즉 5 × 11 = 55를 결과로 출력해야 합니다.소수란 무엇인가?소수(prime number)란 1과 자기 자신 외에는 어떤 수로도 나누어 떨어지지 않는 자연수를 말합니다. 대표적인 소수로는 2, 3, 5, 7, 11, 13 등이 있습니다.예제입력: a
n개 물건의 무게와 가치가 주어졌을 때, 용량이 W인 배낭에 어떤 물건들을 담아야 최대 가치를 얻을 수 있는지, 그리고 실제로 배낭에 포함된 물건들을 출력하는 방법을 살펴봅니다. 0/1 배낭(0/1 Knapsack) 문제란? 배낭(knapsack)은 크기가 정해져 있거나 일정 무게까지만 견딜 수 있는 가방에 비유할 수 있습니다. 배낭에 담으려는 각 물건은 나름의 가치(이익)와 무게를 가지고 있습니다. 우리의 목표는 배낭이 감당할 수 있는 총 무게 범위 안에서 이익이 최대가 되도록 물건을 선택하는 것입니다. 각 물건의 무게와 가치(이
숫자 k와 열려 있는 앱의 ID를 저장하는 n개의 정수 요소를 담은 배열 arr[n]이 주어졌을 때, k개의 최근 사용 앱을 표시하는 것이 이번 문제의 목표입니다. 마치 Alt+Tab 키를 눌렀을 때 최근 앱 목록이 표시되고, 가장 최근에 사용한 앱이 맨 앞에 오듯이 배열을 재구성해야 합니다. 각 ID의 위치는 시스템 내 서로 다른 앱을 의미합니다.배열 위치의 의미arr[0]의 ID는 현재 사용 중인 앱의 ID입니다.arr[1]의 ID는 가장 최근에 사용된 앱의 ID입니다.arr[n-1]의 ID는 가장 오래전에 사용된 앱의 ID입니
x+yi 형태의 복소수와 정수 n이 주어졌을 때, 해당 복소수를 n제곱한 값을 계산해 출력하는 프로그램을 만들어 보겠습니다. 핵심은 단순 반복 방식(O(n))보다 빠른 O(log n) 시간 안에 답을 구하는 것입니다. 복소수란 무엇인가? 복소수(complex number)는 a+bi 형태로 표현되는 수입니다. 여기서 a와 b는 실수이며, i는 i² = −1을 만족하는 허수 단위입니다. 쉽게 말해 복소수는 실수부와 허수부가 결합된 수라고 할 수 있습니다. 복소수 거듭제곱의 원리 복소수를 거듭제곱하려면 먼저 두 복소수의 곱셈 공식
우선순위 큐(Priority Queue)는 우선순위가 부여된 요소들의 집합을 저장하는 추상 자료형(ADT)으로, 각 요소의 우선순위에 따라 삽입과 삭제를 지원합니다. 즉, 가장 높은 우선순위를 가진 요소는 언제든지 먼저 제거될 수 있습니다. 스택(Stack), 큐(Queue), 리스트(List)처럼 위치에 따라 선형적으로 요소를 저장하는 자료구조와 달리, 우선순위 큐는 요소들을 우선순위를 기준으로 저장한다는 점이 특징입니다. 우선순위 큐가 지원하는 주요 연산은 다음과 같습니다. size() – 우선순위 큐에 포함된 요소의 개수를
문제 설명이 문제에서는 N개의 구간(interval)이 주어졌을 때, 서로 겹치지 않는 구간들의 최대 집합을 찾아야 합니다. 두 구간 [i, j]와 [k, l]은 공통으로 포함되는 점이 하나도 없을 때 서로소(disjoint) 관계에 있다고 정의합니다.예를 들어 구간이 {{10, 20}, {23, 35}, {15, 21}, {37, 41}}처럼 주어진 경우, 서로 겹치지 않는 최대 구간 집합은 다음과 같습니다.{10, 20}{23, 35}{37, 41}{15, 21}은 {10, 20}과 겹치기 때문에 결과 집합에는 포함될 수 없습니
문제 설명주어진 부호 없는 정수를 극단 위치(양쪽 끝)의 비트를 서로 교환하여 최댓값으로 만드는 것이 이번 문제입니다. 즉, 첫 번째 비트와 마지막 비트, 두 번째 비트와 뒤에서 두 번째 비트를 차례로 짝지어 교환해 나갑니다.예를 들어 입력 값이 8이라면 이진 표현은 다음과 같습니다.00000000 00000000 00000000 00001000극단 위치의 비트들을 모두 교환하면 아래와 같이 바뀌며, 그 십진수 값은 268435456이 됩니다.00010000 00000000 00000000 00000000알고리즘원래 수의 복사본을
문제 설명정수로 이루어진 배열과 시작 숫자, 그리고 상한값(max limit)이 주어졌을 때, 배열 요소들을 활용해 만들 수 있는 최대값을 구하는 것이 이번 문제의 목표입니다.배열을 처음부터 끝까지 순회하면서 각 단계에서 현재 요소를 이전 단계의 결과에 더하거나 뺄 수 있습니다. 단, 다음 두 조건을 반드시 지켜야 합니다.결과는 어느 시점에서도 0보다 작아서는 안 됩니다.결과는 주어진 최대값을 초과해서는 안 됩니다.인덱스 0에서는 이전 결과가 주어진 숫자(number)라고 가정하며, 어떤 경우에도 답을 구할 수 없다면 -1을 출력합
문제 개요크기가 n인 배열과 자연수 k가 주어졌을 때, 배열에 대해 총 k번의 변경 연산을 수행해야 합니다.여기서 변경 연산이란 배열의 임의의 원소 arr[i]를 골라 부호를 반대로 바꾸는 것(arr[i] = -arr[i])을 의미합니다. 목표는 k번의 연산을 모두 마친 뒤 배열 원소들의 합이 최대가 되도록 연산 대상을 올바르게 선택하는 것입니다.입력 예시arr[] = {7, -3, 5, 4, -1}, k = 2가 입력으로 주어지면 최대 합은 20이 됩니다.1단계: 가장 작은 음수인 -3의 부호를 반전합니다. 배열은 {7, 3, 5
문제 정의크기가 n인 두 개의 배열이 주어졌을 때, 두 번째 배열의 원소를 활용하여 첫 번째 배열을 최대화해야 합니다. 새로 만들어진 배열은 두 배열 전체에서 가장 큰 n개의 고유한(중복 없는) 원소로 구성되며, 두 번째 배열에 우선순위가 주어지므로 두 번째 배열의 원소들이 첫 번째 배열의 원소보다 앞쪽에 배치되어야 합니다. 또한 결과 배열에서 원소의 등장 순서는 입력 배열에서의 순서와 동일하게 유지되어야 합니다.예를 들어 arr1[] = {12, 15, 10}이고 arr2[] = {16, 17, 5}라면, 순서를 유지한 채 두 배
문제 설명이진 배열(binary array)이 주어졌을 때, 부분 배열(subarray)을 단 한 번 뒤집는(flip) 연산을 허용하여 배열 내 0의 개수를 최대화하는 것이 이 문제의 목표입니다.여기서 뒤집기(flip) 연산이란 선택한 구간의 모든 0을 1로, 모든 1을 0으로 바꾸는 것을 의미합니다.예를 들어 arr1 = {1, 1, 0, 0, 0, 0, 0}이라는 배열이 있다고 가정해 보겠습니다.앞쪽에 있는 두 개의 1을 0으로 뒤집으면 다음과 같이 크기가 7인 배열을 얻을 수 있습니다.{0, 0, 0, 0, 0, 0, 0}접근
문제 설명 N개의 정수로 이루어진 배열이 주어집니다. 배열의 모든 원소에 대한 비트 OR(bitwise OR) 값을 최대화해야 하며, 사용할 수 있는 작업은 단 하나뿐입니다. 허용된 작업: 배열에서 임의의 원소 하나를 골라, 주어진 정수 x를 최대 k번 곱하는 것입니다. 예를 들어 입력 배열이 {4, 3, 6, 1}이고 k = 2, x = 3이라면, 얻을 수 있는 최댓값은 55입니다. 접근 방법 핵심 아이디어는 간단합니다. 어떤 원소에 x를 k번 곱하는 것은 x^k(x의 k제곱)를 한 번 곱하는 것과 같으므로, 미리 x^k를 계산
문제 설명정수 N개로 이루어진 배열 arr[]가 주어졌을 때, 먼저 최대 부분 배열(sub-array)의 합을 구한 뒤, 그 부분 배열에서 최대 한 개의 요소를 제거하여 얻을 수 있는 합을 최대화하는 것이 이 문제의 목표입니다.예를 들어 입력 배열이 {1, 2, 3, -2, 3}이라면 최대 부분 배열은 배열 전체이며 합은 7입니다. 여기서 음수인 -2를 제거하면 남는 배열은 다음과 같습니다.{1, 2, 3, 3} → 합계 9 (가능한 최댓값)알고리즘카데인(Kadane) 알고리즘을 사용하여 최대 부분 배열 합을 구합니다.구한 최대 합
문제 정의N개의 요소를 가진 배열 arr[]와 정수 K(K < N)가 주어졌을 때, 동일한 배열에 K개의 정수 요소를 삽입하여 결과 배열의 중앙값(median)을 최대화하는 것이 목표입니다.예를 들어, 입력 배열이 {1, 3, 2, 5}이고 k = 3이라면 다음과 같이 진행됩니다.배열을 정렬하면 {1, 2, 3, 5}가 됩니다.최댓값인 5보다 큰 정수 3개(예: 6)를 삽입합니다. 이 연산 후 배열은 {1, 2, 3, 5, 6, 6, 6}이 됩니다.새 배열의 중앙값은 5입니다.접근 방법 및 알고리즘결과 배열의 중앙값을 최대화하
문제 개요N개의 요소를 가진 배열 arr[]와 정수 K(K < N)가 주어졌을 때, 동일한 배열에 K개의 정수 요소를 삽입하여 결과 배열의 중앙값(median)을 최대화하는 것이 목표입니다.예를 들어, 입력 배열이 {1, 3, 2, 5}이고 k = 3이라면 다음과 같이 진행됩니다.배열을 정렬하면 {1, 2, 3, 5}가 됩니다.최댓값인 5보다 큰 3개의 요소(예: 6, 6, 6)를 삽입합니다. 그러면 배열은 {1, 2, 3, 5, 6, 6, 6}이 됩니다.새 배열의 중앙값은 5입니다.접근 방법중앙값을 최대화하는 핵심 아이디어는
문제 개요부호 없는 정수(unsigned number)가 주어졌을 때, 해당 숫자가 가진 비트들을 재배열하여 만들 수 있는 최대의 수를 구하는 문제입니다.예를 들어 입력값이 8이라면 이 수의 이진수 표현은 다음과 같습니다.00000000000000000000000000001000이 수를 최대화하려면 가장 상위 비트(MSB)부터 1을 채워야 합니다. 즉, 기존에 1로 설정된 비트들을 모두 왼쪽 끝으로 몰아 넣으면 됩니다. 그 결과 값은 2147483648이 되며, 이진수 표현은 다음과 같습니다.1000000000000000000000
문제 설명길이가 L인 막대가 하나 주어져 있으며, 이 막대를 잘라 길이가 각각 p, q, r인 세그먼트의 총 개수를 최대화하는 것이 목표입니다. 단, 세그먼트의 길이는 반드시 p, q, r 중 하나여야 하며, 그 외의 길이로는 자를 수 없습니다.예를 들어 l = 15, p = 2, q = 3, r = 5라고 가정하면 다음과 같이 7개의 세그먼트를 만들 수 있습니다.{2, 2, 2, 2, 2, 2, 3}길이 2짜리 세그먼트 6개와 길이 3짜리 세그먼트 1개를 합치면 정확히 15가 되므로, 이 조합이 만들 수 있는 최대 개수입니다.알고
문제 설명N개의 정수로 이루어진 배열이 주어졌을 때, 배열의 요소들을 자유롭게 재배열할 수 있다면 Σarr[i]×i(단, i = 0, 1, 2, ..., n-1)의 최대값을 구하는 것이 이번 문제의 목표입니다.예를 들어 입력 배열이 {4, 1, 6, 2}라고 가정해 보겠습니다. 요소들을 오름차순으로 정렬하면 최대 합은 28이 됩니다.{1, 2, 4, 6} = (1 × 0) + (2 × 1) + (4 × 2) + (6 × 3) = 28접근 방법: 재배열 부등식이 문제의 핵심 아이디어는 재배열 부등식(Rearrangement Inequ
문제 정의0이 아닌 세 개의 정수 a, b, c가 주어졌을 때, 이 숫자들 사이에 덧셈(+)과 곱셈(*) 기호를 각각 한 번씩 배치하여 만들 수 있는 식의 최댓값을 구하는 것이 목표입니다.여기서 중요한 조건은 다음과 같습니다.숫자의 순서를 자유롭게 재배열할 수 있습니다.덧셈 기호와 곱셈 기호는 반드시 각각 한 번씩 사용해야 합니다.예를 들어 a = 1, b = 3, c = 5라면 최댓값은 다음과 같이 20이 됩니다.(1 + 3) * 5 = 20접근 방법 및 알고리즘숫자들의 부호 조합에 따라 최적의 연산 전략이 달라집니다. 네 가지
문제 설명배열 arr[]가 주어졌을 때, i ≠ j 조건을 만족하면서 (arr[i] – i) – (arr[j] – j)의 최댓값을 구하는 문제입니다. 여기서 i와 j는 0부터 n-1 사이의 값을 가지며, n은 입력 배열 arr[]의 크기입니다.예를 들어 입력 배열이 {7, 5, 10, 2, 3}이라면 다음과 같이 최댓값 9를 얻을 수 있습니다.(요소 10 – 인덱스 2) - (요소 2 – 인덱스 3)(10 – 2) – (2 – 3) = 8 – (-1) = 9알고리즘 접근 방식이 문제의 핵심은 주어진 식을 분해하는 것입니다. (arr