Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++

  1. C++로 세 배열의 최대 합 구하기: 같은 배열을 연속으로 선택할 수 없는 경우

    이 문제에서는 크기가 N인 세 개의 배열 arr1[], arr2[], arr3[]가 주어집니다. 우리의 과제는 같은 배열에서 요소를 연속적으로 선택하는 것이 허용되지 않는다는 조건 아래에서 세 배열로부터 얻을 수 있는 최대 합을 구하는 프로그램을 C++로 작성하는 것입니다.문제 설명각 인덱스 i마다 하나의 요소를 선택하여 총 N개의 요소를 고르고, 그 합이 최대가 되도록 만들어야 합니다. 즉, i번째 선택 값은 arr1[i], arr2[i], arr3[i] 중 하나여야 합니다. 단, 연속된 두 요소를 같은 배열에서 선택할 수 없다는

  2. C++로 구현하는 2×n 그리드 최대 합 알고리즘: 인접한 두 요소를 선택하지 않는 방법

    이 문제에서는 크기가 2×n인 직사각형 그리드가 주어지며, 어떤 두 요소도 서로 인접하지 않도록 요소를 선택하면서 얻을 수 있는 최대 합을 구하는 C++ 프로그램을 작성해야 합니다.문제 설명최대 합을 구하려면 현재 선택한 요소와 세로, 가로, 대각선 어느 방향으로든 인접한 요소는 함께 선택할 수 없습니다.예시를 통해 문제를 자세히 살펴보겠습니다.입력rectGrid[2][] = { {3, 8, 9}, {4, 1, 1} }출력13설명시작 위치별로 가능한 모든 합을 계산하면 다음과 같습니다.rectGrid

  3. C++ 원형 배열에서 인접하지 않은 요소만 선택해 얻는 최대 합 구하기

    이 문제에서는 원형 배열 cirArr[]가 주어집니다. 우리가 작성해야 할 프로그램의 목표는 인접한 두 요소를 동시에 선택하지 않는다는 조건 하에서 원형 배열에서 얻을 수 있는 최대 합을 C++로 구하는 것입니다.문제 설명원형 배열에서 요소들의 최대 합을 구해야 하며, 이때 인접한 요소들은 함께 선택될 수 없습니다. 즉, 요소들을 하나씩 건너뛰면서(번갈아 가며) 선택해야 한다는 의미입니다.원형 배열(Circular Array)은 배열의 마지막 요소가 첫 번째 요소와 연결되어 있는 특수한 형태의 배열입니다.예제를 통해 문제를 자세히

  4. 최대 합 증가 부분 수열(MSIS) 구하기 | C++ 동적 계획법 완벽 가이드

    이 튜토리얼에서는 최대 합 증가 부분 수열(Maximum Sum Increasing Subsequence, MSIS) 문제를 해결하는 프로그램을 다룹니다.N개의 정수로 이루어진 배열이 주어졌을 때, 배열에서 원소들을 선택하여 선택한 원소들이 오름차순으로 정렬된 순서를 유지하면서 그 합이 최대가 되도록 만드는 것이 목표입니다.동적 계획법(DP) 접근 방식이 문제는 최장 증가 부분 수열(LIS)과 매우 유사한 구조를 가지며, 동적 계획법으로 효율적으로 해결할 수 있습니다.핵심 아이디어는 다음과 같습니다.msis[i]는 인덱스 i에서 끝

  5. C++로 접두사와 그 뒤의 특정 요소를 반드시 포함하는 최대 합 증가 부분 수열 구하기

    이 문제에서는 N개의 정수로 이루어진 배열 arr[]과 두 개의 인덱스 값 x, y가 주어집니다. 목표는 인덱스 x까지의 접두사(prefix)로 만들 수 있는 최대 합 증가 부분 수열을 구하되, 그 뒤에 위치한 인덱스 y의 요소를 반드시 포함해야 한다는 조건을 만족하는 프로그램을 C++로 작성하는 것입니다. 문제 설명 인덱스 x까지의 범위에서 증가 부분 수열의 최대 합을 구하고, 마지막에 인덱스 y에 해당하는 요소를 반드시 더해야 합니다. 예제를 통해 문제를 자세히 살펴보겠습니다. 입력 arr[] = {1, 5, 9, 131, 6,

  6. C++ 이진 인덱스 트리(BIT)를 활용한 최대 합 증가 부분 수열 문제 풀이

    이 문제에서는 N개의 원소로 이루어진 배열 arr[]이 주어지며, 우리의 목표는 이진 인덱스 트리(Binary Indexed Tree, 펜윅 트리)를 활용해 C++로 최대 합 증가 부분 수열(Maximum Sum Increasing Subsequence)을 찾는 프로그램을 작성하는 것입니다.문제 이해를 위한 예시입력arr[] = {4, 1, 9, 2, 3, 7}출력13설명가장 합이 큰 증가 부분 수열은 1, 2, 3, 7이며, 그 합은 13입니다.해결 접근 방법이 문제는 일반적인 동적 계획법(DP)으로도 O(N²)에 해결할 수 있지

  7. C++에서 순열의 절대 차이 최대 합 구하기

    문제 개요 이 문제에서는 하나의 배열이 주어지며, 배열 요소들을 임의로 재배열한 순열 중에서 인접한 요소 간 절대 차이의 합이 최대가 되는 값을 구하는 프로그램을 C++로 작성하는 것이 목표입니다. 문제 설명 먼저 주어진 배열의 요소들로 만들 수 있는 모든 순열을 살펴봅니다. 각 순열에서는 인접한 두 요소의 절대 차이를 모두 더하는데, 이때 배열이 원형으로 연결되어 있다고 가정하므로 첫 번째 요소와 마지막 요소의 차이도 합산에 포함됩니다. 그런 다음 계산된 모든 합 중에서 가장 큰 값을 반환하면 됩니다. 예제를 통해 문제를 자세히

  8. C++에서 인접한 요소 간 차이의 최대 합 구하기

    이 문제에서는 하나의 숫자 N이 주어지며, 우리의 과제는 C++ 프로그램을 작성하여 인접한 요소들 간 차이의 최대 합(maximum sum of difference of adjacent elements)을 구하는 것입니다.문제 설명크기가 N인 배열의 모든 순열(permutation)에 대해 인접한 두 요소 간 절댓값 차이의 합을 계산하고, 그중 가장 큰 값을 찾습니다.예제를 통해 문제를 이해해 보겠습니다.입력N = 4출력7설명크기 4의 모든 순열과 각각의 인접 요소 차이 합 : {1, 2, 3, 4} = 1 + 1 + 1 = 3 {

  9. C++에서 LCM이 N이 되는 서로 다른 숫자들의 최대 합 구하기

    이 문제에서는 하나의 숫자 N이 주어집니다. 우리의 과제는 최소공배수(LCM)가 N이 되는 서로 다른 숫자들의 최대 합을 구하는 프로그램을 C++로 작성하는 것입니다.문제 설명N의 모든 약수를 찾아야 하며, 서로 다른 약수들을 모두 더하여 최대 합을 계산합니다.예시를 통해 문제를 이해해 보겠습니다.입력N = 12출력28설명N의 서로 다른 약수는 1, 2, 3, 4, 6, 12입니다. 합 = 1 + 2 + 3 + 4 + 6 + 12 = 28해결 접근 방식가장 간단한 해결 방법은 N의 모든 약수를 찾은 후, 서로 다른 약수들을 모두 더

  10. C++에서 LCM이 N인 서로 다른 숫자들의 최대 합 구하기

    이 문제에서는 하나의 숫자 N이 주어지며, 최소공배수(LCM)가 N이 되는 서로 다른 숫자들의 최대 합을 구하는 C++ 프로그램을 작성해야 합니다. 문제 설명 주어진 숫자 N을 최소공배수(LCM)로 가지는 서로 다른 양의 정수들을 찾고, 이 숫자들의 합이 최대가 되도록 만들어야 합니다. 예제를 통해 문제를 이해해 보겠습니다. 입력 N = 10 출력 18 설명 LCM이 10일 때의 최대 합은 1 + 2 + 5 + 10 = 18 입니다. 해결 접근 방법 이 문제의 핵심 아이디어는 다음과 같습니다. 어떤 수 집합의 최소공배수가 정확히 N

  11. C++에서 행렬의 각 행에서 선택한 요소의 최대 합 구하기

    이 문제에서는 2차원 행렬 mat[][]가 주어집니다. 우리의 과제는 C++로 행렬의 각 행에서 요소를 하나씩 선택하여 만들 수 있는 최대 합을 구하는 프로그램을 작성하는 것입니다.문제 설명행렬의 각 행에서 하나의 요소를 선택할 때, 현재 행에서 선택한 요소는 바로 아래 행에서 선택한 요소보다 커야 한다는 조건이 있습니다. 이 조건을 만족하면서 얻을 수 있는 최대 합을 구하고, 조건을 만족하는 선택이 불가능한 경우에는 -1을 출력합니다.예제를 통해 문제를 자세히 이해해 보겠습니다.입력mat[][] = {{4, 6, 1},{2, 5,

  12. C++로 구현하는 이진 트리의 간결한 인코딩(Succinct Encoding)

    간결한 인코딩이란?이진 트리가 하나 주어져 있다고 가정해 봅시다. 이진 트리의 간결한(succinct) 인코딩은 이론적으로 가능한 최소 공간에 가까운 크기로 트리를 표현하는 방법입니다.서로 다른 n개의 노드를 가질 수 있는 이진 트리의 구조적 형태 개수는 n번째 카탈란 수(Catalan number)와 같습니다. n이 충분히 크면 이 값은 대략 4n에 근사하므로, 트리의 구조를 표현하는 데 최소한 log2(4n) = 2n 비트가 필요합니다. 따라서 간결하게 인코딩된 이진 트리는 2n + O(n) 비트만큼의 공간을 사용하게 됩니다.문

  13. C++에서 하나를 제외한 모든 요소가 m번 반복될 때 배열의 고유 요소 찾기

    배열 A가 주어졌다고 가정해 봅시다. A의 모든 요소는 m번씩 반복되지만, 단 하나의 요소만 딱 한 번 나타납니다. 우리의 목표는 바로 이 고유한 요소를 찾아내는 것입니다.예를 들어 입력이 A = [6, 2, 7, 2, 2, 6, 6]이고 m = 3이라면, 6과 2는 각각 3번씩 나타나므로 출력 결과는 7이 됩니다.문제 해결 접근 방법이 문제는 비트 연산을 활용하면 효율적으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다. 고유하지 않은 요소들은 모두 m번씩 등장하기 때문에, 특정 비트 위치에서 1이 설정된 횟수를 전체 배열

  14. C++로 풀어보는 이진 트리 최대 연속 증가 경로 길이 문제

    이진 트리가 하나 주어졌을 때, 노드 값이 연속적으로 1씩 증가하는 순서로 이루어진 가장 긴 경로의 길이를 계산해야 합니다. 모든 노드는 기본적으로 길이 1짜리 경로로 간주합니다.예를 들어 아래와 같은 이진 트리가 입력으로 주어진다고 가정해 보겠습니다.이 경우 (11 → 12 → 13)이 가장 긴 연속 증가 경로이므로 출력 결과는 3이 됩니다.해결 접근 방법이 문제는 재귀(DFS) 방식으로 해결할 수 있습니다. 핵심 아이디어는 각 노드를 방문하면서 이전 노드 값과 비교하여 연속성을 확인하고, 연속되지 않는 지점에서는 새로운 경로를

  15. C++에서 크기가 다른 k개의 정렬된 배열을 하나로 병합하는 방법

    서로 크기가 다른 k개의 정렬된 배열이 주어졌을 때, 이 배열들을 모두 병합하여 하나의 정렬된 결과를 출력하는 문제입니다.예를 들어 k = 3이고 배열이 {2, 4}, {3, 5, 7}, {1, 10, 11, 12}라면, 병합 후 출력 결과는 다음과 같습니다.1 2 3 4 5 7 10 11 12해결 접근 방식이 문제는 최소 힙(Min-Heap) 기반의 우선순위 큐(priority queue)를 활용하면 효율적으로 해결할 수 있습니다. 각 배열의 첫 번째 원소를 힙에 넣고, 가장 작은 값을 꺼낼 때마다 해당 원소가 속한 배열의 다음

  16. C++로 세 개의 정렬된 배열에서 최소 차이 삼중항 찾기: max(A[i], B[j], C[k]) − min(A[i], B[j], C[k]) 최소화

    개념크기가 서로 같지 않아도 되는 세 개의 정렬된 배열 A, B, C가 주어졌을 때, 각 배열에서 하나씩 선택한 세 원소 A[i], B[j], C[k]로 구성된 삼중항(triplet)에 대해 최댓값과 최솟값의 절대 차이가 가장 작아지도록 만들어야 합니다. 즉, 아래 식을 최소화하는 것이 목표입니다.max(A[i], B[j], C[k]) − min(A[i], B[j], C[k])입력 예시 1A : [ 2, 5, 6, 9, 11 ]B : [ 7, 10, 16 ]C : [ 3, 4, 7, 7 ]출력1설명A[i] = 6, B[j] = 7,

  17. C++로 구현하는 상하좌우 이동이 가능한 2D 그리드 최소 비용 경로 찾기

    2차원 배열이 주어졌을 때, 각 칸에는 해당 칸을 지나가는 데 드는 비용(cost)이 저장되어 있다고 가정해 봅시다. 이때 왼쪽 위(시작점)에서 오른쪽 아래(도착점)까지 이동하면서 소모되는 총 비용이 최소가 되는 경로를 찾는 것이 목표입니다.단, 이동은 상·하·좌·우 네 방향 모두 허용됩니다. 단순한 동적 계획법(DP)으로는 뒤로 되돌아가는 경로를 처리할 수 없기 때문에, 다익스트라(Dijkstra) 알고리즘을 응용한 접근이 필요합니다.문제 예시다음과 같은 5×5 크기의 비용 그리드가 입력으로 주어진다고 해봅시다.3210166131

  18. C++로 보드를 정사각형 조각으로 나누는 최소 절단 비용 구하기

    개념길이 p, 너비 q인 보드가 주어졌다고 가정해 봅시다. 우리는 이 보드를 p×q개의 정사각형 조각으로 나누어야 하며, 이때 발생하는 절단 비용을 최소화하는 것이 목표입니다. 보드의 각 가로·세로 모서리에는 고유한 절단 비용이 부여되어 있습니다. 요약하자면, 전체 비용을 최소화하는 최적의 절단 순서를 찾는 문제입니다.예시 위 보드를 정사각형으로 나누는 최적의 절단 방법은 다음과 같습니다.위 경우의 총 최소 비용은 65이며, 아래 단계를 통해 계산됩니다.초기값 : Total_cost = 0 Total_cost = Total

  19. C++로 체스판을 두 조각으로 나누지 않고 만들 수 있는 최대 컷 수 구하기

    개념A×B 크기의 체스판이 주어졌을 때, 체스판이 두 개의 조각으로 나뉘지 않도록 만들 수 있는 최대 컷(칼집)의 개수를 계산하는 것이 이 문제의 목표입니다.예시입력:A = 2, B = 4출력:최대 컷 수 = 3입력:A = 2, B = 2출력:최대 컷 수 = 1풀이 방법A = 2, B = 2인 경우에는 컷을 1개(빨간색 표시)만 만들 수 있습니다. 여기에 컷을 하나 더 추가하면 체스판이 두 조각으로 갈라지게 됩니다.A = 2, B = 4인 경우에는 컷을 3개(빨간색 표시)까지 만들 수 있습니다. 마찬가지로 하나라도 더 추가하면 체스

  20. C++로 오일러 회로 완성하기: 추가해야 할 최소 간선 수 구하는 방법

    개념b개의 노드와 a개의 간선으로 이루어진 무방향 그래프가 주어졌을 때, 해당 그래프에서 오일러 회로(Euler Circuit)를 완성하기 위해 추가해야 하는 최소 간선의 개수를 구하는 것이 이 글의 목표입니다.입력b = 3, a = 2 Edges[] = {{1, 2}, {2, 3}}출력1노드 1과 3을 연결하는 간선 하나를 추가하면 오일러 회로가 완성됩니다.접근 방법그래프에 오일러 회로가 존재하려면 모든 노드의 차수(degree)가 반드시 짝수여야 합니다. 그래야 어떤 노드에 진입한 뒤 다시 빠져나갈 수 있는 간선이 항상 존재하기

Total 5981 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:194/300  20-컴퓨터/Page Goto:1 188 189 190 191 192 193 194 195 196 197 198 199 200