이 문제에서는 하나의 배열과 정수 k가 주어지며, 주어진 배열을 k번 반복하여 만든 새로운 배열에서 최대 부분배열 합(maximum subarray sum)을 찾는 프로그램을 C++로 작성해야 합니다. 문제 설명 주어진 배열을 k번 이어 붙여 형성된 배열에서 얻을 수 있는 연속된 부분배열 중, 원소들의 합이 가장 큰 부분배열의 합을 구하는 것이 목표입니다. 예제를 통해 문제를 살펴보겠습니다. 입력 − array = {3, 5, 1}, k = 2 출력 − 18 설명 − 배열을 k번 반복하여 형성된 배열, array = {3, 5, 1
문제 정의양수와 음수가 섞여 있는 정수 배열이 주어졌을 때, 이 배열에서 구할 수 있는 최대 부분 배열 합(Maximum Subarray Sum)을 찾는 문제입니다.예시입력 배열이 {-12, -5, 4, -1, -7, 1, 8, -3}라고 가정해 보겠습니다. 이때 최대 부분 배열은 {1, 8}이며, 그 합인 9가 결과로 출력됩니다.알고리즘접두사 합(Prefix Sum)을 활용하면 반복문 한 번만으로 문제를 해결할 수 있어 시간 복잡도가 O(n)입니다. 핵심 아이디어는 특정 지점에서 끝나는 최대 부분 배열 합 = 현재 접두사 합 −
문제 개요이 문제에서는 크기가 n인 배열과 정수 m이 주어집니다. 우리의 과제는 C++로 배열의 모든 부분 배열(subarray) 합을 m으로 나눈 나머지(modulo) 중 가장 큰 값을 찾는 프로그램을 작성하는 것입니다.프로그램 설명 − 여기서는 부분 배열의 모든 요소 합을 m으로 나누었을 때 얻을 수 있는 나머지 값 중 최대값을 구합니다.예시로 문제 이해하기입력 − arr[] = {4, 9, 2}, m = 6출력 − 5설명 − 가능한 모든 부분 배열과 각각의 나머지 값은 다음과 같습니다.{4}: 4 % 6 = 4{9}: 9 %
문제 정의음수가 아닌 정수로 이루어진 배열과 하나의 정수 k가 주어졌을 때, 부분 집합에 속한 모든 원소를 비트 OR 연산한 결과가 정확히 k가 되는 최대 길이의 부분 집합을 찾는 것이 목표입니다.예시입력 배열 = [1, 4, 2], k = 3일 때 출력: [1, 2] 1과 2의 비트 OR 값은 3입니다. 길이가 2보다 큰 부분 집합은 만들 수 없습니다.접근 방법먼저 비트 OR 연산의 기본 성질을 살펴보겠습니다.0 OR 0 = 0 1 OR 0 = 1 1 OR 1 = 1k의 이진 표현에서 비트가 0인 자리에는, 결과 부분 집합에 포함
이 문제에서는 정수 N이 주어집니다. 우리의 과제는 N을 약수(제수)로 반복해서 나눈 후 얻을 수 있는 최대 합을 찾는 프로그램을 C++로 작성하는 것입니다.문제 설명숫자 N을 1이 될 때까지 재귀적으로 계속 나누고, 그 과정에서 등장하는 모든 값(N 자신 포함)을 더했을 때 만들어질 수 있는 최대 합을 구합니다.예를 들어 문제를 이해해 보겠습니다.입력 − N = 12출력 − 22설명 − 숫자를 반복해서 나누고 그 합을 구해 보면 다음과 같습니다.나눗셈 1: 12 / 2 = 6나눗셈 2: 6 / 2 = 3나눗셈 3: 3 / 3 =
문제 설명N개의 숫자로 이루어진 배열이 주어졌을 때, 세트 비트(set bit, 값이 1인 비트)의 개수가 서로 같은 숫자들끼리 묶어 합산했을 때 얻을 수 있는 최대 합을 찾는 것이 이번 문제의 목표입니다.예시입력 배열이 {2, 5, 8, 9, 10, 7}일 때, 각 숫자의 세트 비트 개수는 다음과 같습니다.2 → 세트 비트 1개5 → 세트 비트 2개8 → 세트 비트 1개9 → 세트 비트 2개10 → 세트 비트 2개7 → 세트 비트 3개여기서 세트 비트가 2개인 숫자들은 5, 9, 10이며, 이들의 합은 5 + 9 + 10 = 24
문제 설명숫자로 이루어진 직각 삼각형이 주어졌을 때, 꼭대기에서 밑변까지 내려가는 여러 경로 중에서 지나가는 숫자들의 합이 가장 커지는 경로를 찾아 그 최대 합을 구하는 문제입니다.단, 각 경로에서 다음 숫자는 반드시 바로 아래에 있거나, 아래이면서 한 칸 오른쪽에 위치한 숫자여야 합니다.예시입력: 3 4 5 1 10 7 최대 합은 18 (3 + 5 + 10)알고리즘 접근 방식핵심 아이디어는 마지막 행(밑변)의 모든 셀에 대해 그 셀에서 끝나는 경로의 최대 합을 각각 구한 뒤, 그중 가장 큰 값을 반환하는 것입니다.각 셀의 최대
이 문제에서는 하나의 행렬(matrix)이 주어지며, C++을 사용해 행렬 안에서 만들 수 있는 모래시계(hourglass) 모양 요소들의 최대 합을 찾는 프로그램을 작성하는 것이 목표입니다. 문제 설명 주어진 행렬의 요소들로 만들 수 있는 모든 모래시계의 합을 계산하고, 그중 가장 큰 값을 찾습니다. 모래시계란 행렬에서 다음과 같은 형태를 가지는 7개의 요소로 이루어진 도형을 말합니다. X X X X X X X 예제로 이해하기 입력 − array = { {2 4 0 0} {0 1 1 0} {4 2 1 0}
문제 개요 이 문제에서는 배열 arr가 주어지며, 주어진 배열의 모든 회전(rotation) 중에서 i × arr[i]의 합이 최대가 되는 값을 찾는 프로그램을 C++로 작성하는 것이 목표입니다. 문제 설명 − 배열을 회전할 때마다 각 원소에 해당 인덱스를 곱한 값({i * arr[i]})의 합을 계산하고, 그 합들 중 최댓값을 구합니다. 예제를 통해 문제를 이해해 보겠습니다. 입력 − arr = {4, 8, 1, 5} 출력 − 37 설명 − 모든 회전과 i*arr[i]의 합 : {4, 8, 1, 5} = 4*0 + 8*1 + 1
이 문제에서는 하나의 배열과 정수 k가 주어집니다. 우리의 과제는 최댓값이 k인 서로 겹치지 않는(non-overlapping) 부분 배열들을 찾아, 그 길이들의 합이 최대가 되도록 하는 프로그램을 C++로 작성하는 것입니다.문제 설명배열과 정수 k가 주어졌을 때, 이 배열에서 만들 수 있는 모든 겹치지 않는 부분 배열 중 최댓값이 정확히 k인 부분 배열들을 찾아야 합니다. 그런 다음, 찾은 부분 배열들의 길이를 모두 더한 값을 결과로 반환합니다.예제로 이해하기입력 — array = {3, 7, 1, 2, 3, 1, 6, 3, 2,
이 문제에서는 하나의 이진 트리(binary tree)가 주어집니다. 우리가 작성해야 할 프로그램은 주어진 이진 트리의 모든 레벨(level) 중에서 잎이 아닌 노드(non-leaf node)들의 합이 가장 큰 값을 찾아 출력하는 것입니다. 문제 설명 트리의 각 레벨별로 잎이 아닌 노드들의 데이터 합을 계산한 뒤, 그 값들 중 최대값을 구해 출력합니다. 예시를 통해 문제를 자세히 살펴보겠습니다. 입력 − 출력 − 9 설명 − 각 레벨별 잎이 아닌 노드의 합은 다음과 같습니다. 레벨 1: 4 레벨 2: 1 + 2 = 3 레벨 3:
문제 정의n×n 크기의 행렬이 있고, 각 칸에는 특정 값이 할당되어 있다고 가정합니다. 우리는 i번째 행의 어떤 칸에서든 (i+1)번째 행의 대각선 방향 칸으로만 이동할 수 있습니다. 즉, cell(i, j)에서는 cell(i+1, j-1) 또는 cell(i+1, j+1) 두 곳으로만 이동이 가능합니다. 이 규칙을 지키면서 첫 번째 행에서 마지막 행까지 내려가는 경로 중, 지나가는 칸 값들의 합이 최대가 되는 경로를 찾는 것이 이 문제의 목표입니다.예시입력이 다음과 같다고 가정해 봅시다:{ {5, 6, 1, 1
문제 설명두 개의 정렬된 배열이 주어지며, 두 배열은 일부 공통 원소를 포함할 수 있습니다. 이때 어느 한 배열의 시작 지점에서 두 배열 중 하나의 끝 지점까지 도달하는 최대 합 경로의 총합을 구하는 것이 목표입니다.중요한 제약 조건은 한 배열에서 다른 배열로 전환할 수 있는 시점이 오직 공통 원소에서만 가능하다는 점입니다. 단, 공통 원소가 반드시 동일한 인덱스 위치에 있어야 하는 것은 아닙니다.기대되는 시간 복잡도는 O(m+n)이며, 여기서 m은 arr1[]의 원소 개수, n은 arr2[]의 원소 개수입니다.예제입력이 다음과 같
문제 개요이 문제에서는 하나의 배열과 목표 합(sum)이 주어집니다. 우리가 해야 할 작업은 C++ 프로그램을 작성하여 주어진 합보다 작거나 같은 합을 가지는 부분 배열(subarray) 중 최대 합을 구하는 것입니다.즉, 길이가 n 이하인 임의의 부분 배열 중에서 그 합이 주어진 값 이하가 되는 경우를 모두 고려해, 그중 가장 큰 합을 찾아야 합니다.예제로 문제 이해하기입력 − array = {3, 5, 1, 8, 2, 9}, sum = 25출력 − 25설명 − 합이 25 이하인 부분 배열 중 {5, 1, 8, 2, 9}의 합이
이 문제에서는 하나의 배열이 주어지며, 최대 한 개의 요소를 제거했을 때 얻을 수 있는 최대 합 부분 배열(maximum sum subarray)을 찾는 프로그램을 C++로 작성하는 것이 목표입니다. 쉽게 말해, 배열에서 단 하나의 요소를 제거했을 때 남은 요소들의 합이 가장 커지도록 만드는 요소를 찾아야 합니다. 먼저 예시를 통해 문제를 살펴보겠습니다. 입력 − array = {5, 1, 9, 2, -1, 7} 출력 − 24 설명 − 배열에서 -1을 제거하면 가능한 모든 경우 중 가장 큰 합을 얻을 수 있습니다. 문제 해결 접근
서로 다른 정수들의 컬렉션이 주어졌을 때, 가능한 모든 순열(permutation)을 찾아야 합니다. 이때 배열에 중복된 요소가 포함되어 있다면, 겉보기에 동일한 순열은 결과에서 제외해야 합니다. 예를 들어 배열이 [1,1,3]이라면, 결과는 [[1,1,3], [1,3,1], [3,1,1]]이 됩니다.문제 해결 접근 방법이 문제는 재귀(recursion)와 스왑(swap)을 활용한 백트래킹 기법으로 효율적으로 해결할 수 있습니다. 핵심 아이디어는 각 자리에 올 수 있는 값을 하나씩 고정해 가며 순열을 만들되, 이미 처리한 값이 다시
나선형 행렬(Spiral Matrix)이란?행렬이 주어졌을 때 모든 요소를 나선형(spiral) 순서로 출력해야 하는 경우가 있습니다. 먼저 첫 번째 행의 전체 내용을 출력한 뒤, 마지막 열을 따라 위에서 아래로 출력하고, 이어서 마지막 행을 오른쪽에서 왼쪽으로, 그다음에는 첫 번째 열을 아래에서 위로 출력합니다. 한 바퀴를 돌고 나면 경계를 한 단계씩 안쪽으로 좁혀 가며 같은 과정을 반복하는 방식입니다.예를 들어 다음과 같은 3×6 행렬이 있다고 가정해 보겠습니다.123456789101112131415161718이 행렬을 나선형으
문제 개요연결 리스트(linked list)와 기준 값 x가 주어졌을 때, 리스트를 두 개의 파티션으로 나누는 문제를 생각해 보겠습니다. 조건은 다음과 같습니다.x보다 작은 값을 가진 노드들은 모두 앞쪽에 위치해야 합니다.x보다 크거나 같은 값을 가진 노드들은 그 뒤에 위치해야 합니다.두 파티션 각각 안에서는 원래 노드들의 상대적인 순서가 그대로 유지되어야 합니다.예를 들어 리스트가 [1,4,3,2,5,2]이고 x = 3이라면, 출력은 [1,2,2,4,3,5]가 됩니다.해결 전략: 더미 노드 활용이 문제는 더미(dummy) 노드 두
그레이 코드란 무엇인가?그레이 코드(Gray Code)는 인접한 두 값이 오직 한 비트만 다른 특징을 가지는 이진수 체계입니다. 디지털 회로나 엔코더 등에서 오류를 최소화하기 위해 널리 사용되는 코드 방식입니다.문제의 조건은 다음과 같습니다. 비트의 총 개수를 나타내는 음이 아닌 정수 n이 주어졌을 때, 그레이 코드 시퀀스 전체를 출력해야 하며, 시퀀스는 반드시 0으로 시작해야 합니다.예를 들어 입력이 2라면 결과는 [0, 1, 3, 2]가 됩니다. 이유는 다음과 같습니다.0의 그레이 코드 → 001의 그레이 코드 → 012의 그레
이진 트리 레벨 순서 순회란?이진 트리가 하나 있다고 가정해 보겠습니다. 이 트리를 레벨 순서 순회(Level Order Traversal), 즉 너비 우선 탐색(BFS) 방식으로 탐색해야 합니다. 레벨 순서 순회는 루트 노드부터 시작하여 같은 깊이(레벨)에 있는 노드들을 왼쪽에서 오른쪽 순서로 차례대로 방문하는 기법입니다.예를 들어 다음과 같은 이진 트리가 있다고 합시다.이 트리를 레벨 순서로 순회하면 결과는 다음과 같습니다.[10, 5, 16, 8, 15, 20, 23]알고리즘 접근 방법레벨 순서 순회는 큐(Queue) 자료구조