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

C++

  1. C++로 구현하는 음수 포함 배열의 쌍별 곱 최대 합 알고리즘

    이 튜토리얼에서는 음수를 포함할 수 있는 배열에서 쌍별 곱(pairwise product)의 최대 합을 구하는 프로그램을 C++로 구현하는 방법을 알아보겠습니다. 문제 조건은 다음과 같습니다. 정수로 이루어진 배열이 주어지며, 배열의 원소들을 두 개씩 짝지어 곱한 값들의 합이 최대가 되도록 만들어야 합니다. 각 원소는 정확히 한 번만 짝에 사용될 수 있습니다. 알고리즘 접근 방법 이 문제의 핵심 아이디어는 그리디(Greedy) 접근법입니다. 배열을 먼저 정렬한 뒤 아래 규칙에 따라 원소들을 짝지어 줍니다. 배열을 오름차순으로 정

  2. C++로 두 배열 곱의 최대 합 구하는 방법

    이번 튜토리얼에서는 두 배열의 곱의 최대 합(Maximum Sum of Products)을 구하는 프로그램을 C++로 작성해 보겠습니다.문제 이해하기크기가 같은 두 개의 배열이 주어집니다. 첫 번째 배열의 원소와 두 번째 배열의 원소를 하나씩 짝지어 곱한 뒤, 그 곱들을 모두 더했을 때 가장 커지는 합을 찾는 것이 목표입니다.예를 들어 배열 A = {1, 2, 3}, 배열 B = {4, 5, 1}이 주어졌다면, 두 배열의 원소를 어떻게 짝지느냐에 따라 결과가 달라지므로 합을 최대화하는 짝짓기를 찾아야 합니다.접근 방법핵심 아이디어는

  3. C++ 배열에서 최솟값과 두 번째 최솟값의 최대 합 구하기

    이 튜토리얼에서는 배열에서 가장 작은 요소와 두 번째로 작은 요소의 최대 합을 구하는 프로그램을 다룹니다.정수로 이루어진 배열이 주어졌을 때, 가능한 모든 부분 배열(subarray)에 대해 각각 가장 작은 값 + 두 번째로 작은 값을 계산하고, 그중 최댓값을 찾는 것이 목표입니다.접근 방법이 문제의 핵심 아이디어는 다음과 같습니다. 임의의 부분 배열에서 가장 작은 값과 두 번째로 작은 값의 합은, 해당 부분 배열 내에 존재하는 인접한 두 요소의 합보다 클 수 없습니다. 따라서 전체 배열을 한 번만 순회하면서 인접한 두 요소의 합

  4. C++로 구현하는 행렬 위→아래 최대 합 경로 찾기 알고리즘

    이 튜토리얼에서는 C++ 프로그램을 사용하여 행렬에서 위쪽 행부터 아래쪽 행까지 이동하는 경로 중 합이 최대가 되는 경로를 찾는 방법을 다룹니다.문제 정의N×N 크기의 행렬이 주어졌을 때, 첫 번째 행에서 시작하여 마지막 행에 도달하는 경로 중 원소 값의 합이 가장 큰 경로를 구해야 합니다. 이때 이동 규칙은 현재 위치에서 바로 아래 대각선 방향(왼쪽 아래 또는 오른쪽 아래)의 칸으로만 이동할 수 있습니다.이 문제는 동적 계획법(Dynamic Programming)을 활용하면 효율적으로 해결할 수 있습니다. 아래에서부터 거꾸로 올라

  5. C++ 배열에서 두 요소의 거리가 K 미만이 되지 않도록 하는 부분 수열의 최대 합 구하기

    이 튜토리얼에서는 C++를 이용해 배열에서 두 요소가 서로 K 미만의 거리에 놓이지 않도록 선택할 때, 만들 수 있는 부분 수열의 최대 합을 구하는 프로그램을 다룹니다. 문제의 조건은 다음과 같습니다. N개의 정수로 이루어진 배열과 값 K가 주어지며, 우리는 서로의 인덱스 거리가 충분히 떨어진 요소들만 포함하는 부분 수열 중에서 합이 가장 큰 경우를 찾아야 합니다. 접근 방법: 동적 계획법(Dynamic Programming) 이 문제는 동적 계획법을 사용하면 선형 시간 안에 효율적으로 해결할 수 있습니다. 핵심 아이디어는 다음과

  6. C++ 동적 계획법으로 2D 행렬의 최대 합 사각형 찾기 | DP 알고리즘 튜토리얼

    문제 개요이 튜토리얼에서는 2차원 행렬(2D Matrix)에서 원소들의 합이 최대가 되는 사각형 부분 행렬을 찾는 프로그램을 구현해 보겠습니다.음수와 양수가 섞여 있는 행렬이 주어졌을 때, 우리의 목표는 포함된 모든 원소의 합이 가장 큰 직사각형 영역을 찾아 그 위치와 합계를 출력하는 것입니다.접근 방식: 카데인 알고리즘의 확장이 문제는 1차원 배열의 최대 부분 배열 합을 구하는 유명한 카데인 알고리즘(Kadanes Algorithm)을 2차원으로 확장하여 효율적으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.행렬의 왼쪽

  7. C++에서 시작 값과 끝 값이 같은 최대 합 부분 배열 찾기

    이 튜토리얼에서는 시작 값과 끝 값이 동일한 최대 합 부분 배열(subarray)을 찾는 프로그램을 다룹니다. 정수로 이루어진 배열이 하나 주어지며, 우리의 목표는 양쪽 끝에 위치한 두 요소의 값이 서로 같으면서 그 합이 최대가 되는 부분 배열을 찾는 것입니다. 접근 방식 이 문제는 누적 합(prefix sum)과 해시 맵(unordered_map)을 함께 활용하면 선형 시간 안에 효율적으로 해결할 수 있습니다. 전체적인 알고리즘의 흐름은 다음과 같습니다.1. 배열의 각 인덱스까지의 누적 합을 미리 계산해 저장합니다.2. 각 값이

  8. C++로 풀어보는 최소 K 간격 요소를 가진 최대 합 부분 수열 문제

    이 튜토리얼에서는 최소 K 간격 이상 떨어진 요소들로 구성되는 최대 합 부분 수열(maximum sum subsequence)을 찾는 프로그램을 C++로 구현하는 방법을 알아봅니다. 정수로 이루어진 배열과 값 K가 주어집니다. 우리의 목표는 선택한 모든 요소가 서로 최소 K개 이상의 거리(즉, 인덱스 차이가 K+1 이상)를 유지하면서 그 합이 최대가 되는 부분 수열을 찾는 것입니다. 동적 계획법을 활용한 접근 방식 이 문제는 동적 계획법(Dynamic Programming)을 사용하면 효율적으로 해결할 수 있습니다. 핵심 아이디어는

  9. C++로 두 문자열 간 최소 편집 거리(레벤슈타인 거리) 구하기

    문제 개요두 단어 S와 T가 주어졌을 때, S를 T로 변환하는 데 필요한 최소 연산 횟수를 구하는 문제입니다. 사용할 수 있는 연산은 다음 세 가지입니다.문자 삽입(insert)문자 삭제(delete)문자 교체(replace)예를 들어 입력 문자열이 evaluate와 fluctuate라면 필요한 최소 연산 횟수는 5입니다. 이 값은 일반적으로 레벤슈타인 거리(Levenshtein Distance)라고 불리며, 동적 계획법(Dynamic Programming)을 이용하면 효율적으로 구할 수 있습니다.풀이 접근 방식핵심 아이디어는 dp

  10. C++로 회전된 정렬 배열에서 최댓값 찾는 방법

    문제 소개정렬되어 있던 배열이 알 수 없는 피벗(pivot) 지점을 기준으로 회전되어 있다고 가정해 봅시다. 이처럼 회전된 배열 안에서 최댓값을 찾아야 합니다. 예를 들어 배열이 [3,4,5,1,2]와 같다면 출력 결과는 5가 됩니다.배열의 모든 요소를 하나씩 순회하는 O(n) 방식 대신, 이진 탐색(Binary Search)을 활용하면 훨씬 효율적으로 문제를 해결할 수 있습니다.해결 접근 방법low := 0, high := 배열의 마지막 인덱스, n := 배열의 크기, ans := 0으로 초기화합니다.low <= high를

  11. C++로 유전자 서열의 전체 돌연변이 그룹 개수 찾기

    모든 요소의 길이가 같고 문자 A, C, G, T로만 구성된 문자열 리스트 genes가 있다고 가정해 보겠습니다. 이때 다음과 같은 규칙이 적용됩니다.두 문자열 s1과 s2가 단 한 글자만 다를 경우, 두 문자열은 같은 돌연변이 그룹에 속합니다.s1과 s2가 같은 그룹에 있고, s2와 s3가 같은 그룹에 있다면 s1과 s3 역시 같은 그룹에 속합니다(추이성).우리가 구해야 하는 값은 이 규칙들로부터 만들어질 수 있는 돌연변이 그룹의 총 개수입니다.예를 들어 입력이 genes = [ACGT, ACGC, ACTT, TTTT, TGTT]

  12. C++로 이진 트리 높이 균형 확인하기 – DFS 재귀 구현 가이드

    이진 트리의 높이 균형이란?하나의 이진 트리(binary tree)가 주어졌을 때, 그 트리의 높이가 균형 잡혀 있는지 확인해야 합니다. 높이 균형(height-balanced) 트리란 트리에 속한 모든 노드에 대해 왼쪽 서브트리의 높이와 오른쪽 서브트리의 높이 차이의 절댓값이 0 또는 1인 트리를 말합니다. 이 조건은 AVL 트리와 같은 자가 균형(self-balancing) 이진 탐색 트리의 핵심 개념이기도 합니다.예를 들어 아래와 같은 트리가 입력으로 주어지면,출력 결과는 True(균형 잡힌 트리)가 됩니다.문제 해결 접근 방

  13. C++로 숫자의 이진수 표현에서 가장 긴 연속된 1의 길이 구하기

    어떤 수 n이 주어졌을 때, 이 숫자를 2진수(이진수)로 표현했을 때 나타나는 1 중에서 가장 길게 연속된 구간의 길이를 구하는 문제입니다.문제 예시예를 들어 입력값이 n = 312라고 가정해 보겠습니다. 312를 2진수로 변환하면 100111000이 되는데, 여기서 1이 연속으로 등장하는 가장 긴 구간은 3개이므로 출력 결과는 3이 됩니다.해결 접근 방법이 문제는 숫자의 각 비트를 하나씩 확인하면서 연속된 1의 개수를 세는 방식으로 해결할 수 있습니다. 알고리즘은 다음과 같습니다.결과값 ret과 현재 연속 길이 len을 각각 0으

  14. C++로 이진 트리의 왼쪽 뷰(Left View) 구하기

    이진 트리가 하나 주어졌다고 가정해 봅시다. 이 트리를 왼쪽에서 바라보면 특정 노드들만 보이게 되는데, 우리는 그 보이는 노드들을 출력해야 합니다.예를 들어 트리가 다음과 같다면 −출력 결과는 [1, 2, 5]가 됩니다. 왼쪽에서 볼 때 루트 노드 1, 두 번째 깊이에서 가장 왼쪽에 있는 노드 2, 세 번째 깊이에서 가장 왼쪽에 있는 노드 5만 보이기 때문입니다.접근 방법이 문제는 DFS(깊이 우선 탐색)와 깊이(depth) 추적을 활용하면 효율적으로 해결할 수 있습니다. 핵심 아이디어는 각 깊이에서 가장 먼저 방문되는

  15. C++로 구현하는 이진 트리 레벨 순서 순회(Level Order Traversal) 프로그램

    개요이진 트리(Binary Tree)가 하나 주어져 있다고 가정해 보겠습니다. 이 트리를 레벨 순서 순회(Level Order Traversal), 즉 너비 우선 탐색(BFS) 방식으로 순회해야 합니다.예를 들어 트리가 다음과 같은 구조라면,레벨 순서대로 방문한 결과는 다음과 같습니다.[1, 2, 3, 5, 4]해결 접근 방법레벨 순서 순회는 큐(Queue) 자료구조를 활용하면 간단하게 구현할 수 있습니다. 알고리즘의 동작 단계는 다음과 같습니다.노드를 저장할 큐(que)를 정의합니다.루트(root) 노드를 큐에 삽입합니다.큐가 비

  16. C++로 이진 트리에서 노드 합이 최소가 되는 레벨 찾기

    이진 트리가 하나 주어져 있다고 가정해 보겠습니다. 루트 노드의 레벨은 1이며, 그 자식 노드들은 레벨 2, 그다음 세대는 레벨 3처럼 순차적으로 증가합니다. 이때 우리가 구해야 할 것은 특정 레벨 X에 존재하는 모든 노드 값의 합이 최솟값이 되도록 하는 가장 작은 레벨 X입니다.예를 들어 다음과 같은 트리가 있다고 합시다.2번째 레벨의 노드 값 합은 4 + (-10) = -6으로, 다른 어떤 레벨보다도 작습니다. 따라서 출력 결과는 2가 됩니다.문제 해결 접근 방법이 문제는 BFS(너비 우선 탐색)을 활용하면 효율적으로 해결할 수

  17. C++로 숫자 리스트를 연속 증가하는 k개 요소의 부분 리스트로 분할 가능한지 확인하는 프로그램

    숫자로 이루어진 리스트 nums와 하나의 정수 k가 주어졌을 때, 이 리스트를 각각 정확히 k개의 값으로 구성되고 그 값들이 연속적으로 1씩 증가하는 여러 개의 부분 리스트로 나눌 수 있는지 확인해야 합니다.예를 들어 입력이 nums = [4, 3, 2, 4, 5, 6], k = 3이라면 출력은 True가 됩니다. 리스트를 [2, 3, 4]와 [4, 5, 6] 두 그룹으로 분할할 수 있기 때문입니다. 각 그룹은 3개의 값을 가지며, 값들이 연속적으로 증가합니다.문제 해결 접근 방법이 문제는 맵(map)을 활용한 그리디(greedy)

  18. C++로 가장 긴 바이토닉 부분 수열의 길이 구하기

    숫자 배열이 주어졌을 때, 그중에서 가장 긴 바이토닉(bitonic) 부분 수열의 길이를 찾는 문제입니다. 바이토닉 수열이란 처음에는 엄격하게(strictly) 증가하다가 이후에는 엄격하게 감소하는 수열을 의미합니다. 단, 순수하게 증가만 하거나 감소만 하는 수열 역시 바이토닉 수열로 간주됩니다.예를 들어 입력이 nums = [0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15]이고 수열의 크기가 16이라면, 결과는 7이 됩니다.문제 해결 접근 방법이 문제는 동적 프로그래밍(Dynamic

  19. C++로 두 문자열의 최장 공통 부분 수열(LCS) 길이 구하는 프로그램

    두 개의 문자열 text1과 text2가 주어졌을 때, 두 문자열의 최장 공통 부분 수열(Longest Common Subsequence, LCS)의 길이를 구해야 합니다.여기서 부분 수열(subsequence)이란 원본 문자열에서 일부 문자를 삭제하되, 나머지 문자들의 상대적인 순서는 그대로 유지한 채 만들어진 새로운 문자열을 의미합니다. 예를 들어 abe는 abcde의 부분 수열이지만, 순서가 뒤바뀌었기 때문에 adc는 부분 수열이 아닙니다. 공통 부분 수열은 두 문자열 모두에 존재하는 부분 수열을 말하며, 만약 공통 부분 수열

  20. C++로 두 문자열의 가장 긴 공통 부분 문자열 길이 찾기

    두 개의 소문자 문자열 X와 Y가 주어졌을 때, 두 문자열에 공통으로 나타나는 가장 긴 부분 문자열(longest common substring)의 길이를 구하는 문제입니다.예를 들어, X = helloworld, Y = worldbook이라고 하면, 두 문자열에 공통으로 포함된 가장 긴 부분 문자열은 world이므로 결과는 5가 됩니다.이 문제는 동적 계획법(Dynamic Programming)을 이용해 효율적으로 해결할 수 있습니다. 풀이 과정은 다음과 같습니다.(m+1) × (n+1) 크기의 2차원 배열 longest를 정의합

Total 5981 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:219/300  20-컴퓨터/Page Goto:1 213 214 215 216 217 218 219 220 221 222 223 224 225