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

C++

  1. C++로 구현하기: 1의 개수가 0의 개수보다 정확히 1개 많은 최대 부분 행렬 넓이 찾기

    문제 개요이 튜토리얼에서는 1의 개수가 0의 개수보다 정확히 하나 더 많은 부분 행렬(sub-matrix) 중에서 넓이가 최대인 것을 찾는 프로그램을 C++로 구현하는 방법을 알아봅니다.입력으로는 0과 1로만 이루어진 N×N 행렬이 주어지며, 목표는 조건을 만족하는 부분 행렬의 시작 위치(왼쪽 상단, 오른쪽 하단 좌표)와 최대 넓이를 구하는 것입니다.알고리즘 접근 방식핵심 아이디어는 2차원 행렬 문제를 1차원 배열 문제로 변환하는 것입니다.각 셀의 값에서 1은 +1, 0은 -1로 치환합니다. 그러면 1이 0보다 하나 더 많은 구간은

  2. 3개가 연속되지 않도록 하는 최대 부분 수열 합 구하기

    이 튜토리얼에서는 세 개의 숫자가 연속으로 선택되지 않도록 하면서 최대 부분 수열 합을 구하는 프로그램을 다룹니다.문제 설명양의 정수로 이루어진 배열이 주어집니다. 우리의 목표는 임의의 세 숫자가 연속으로 포함되지 않는다는 조건을 지키면서, 부분 수열의 합이 최대가 되도록 만드는 것입니다.예를 들어 배열 {1, 2, 3}에서는 세 숫자를 모두 더할 수 없으므로, {1, 2}, {2, 3}, {1, 3} 중 하나를 선택해야 합니다.접근 방식: 동적 계획법이 문제는 동적 계획법(DP)으로 효율적으로 해결할 수 있습니다. sum[i]를

  3. C++로 구현하는 이진 트리의 최대 BST 하위 트리 합계 찾기

    이 튜토리얼에서는 이진 트리(Binary Tree)에서 하위 트리(sub-tree)가 동시에 BST(이진 탐색 트리)인 경우 중, 합계가 가장 큰 하위 트리의 합을 구하는 프로그램을 다룹니다.하나의 이진 트리가 주어지며, 우리의 목표는 그 트리를 구성하는 하위 트리 중 BST 조건을 만족하는 것들만 골라내어, 그중 합이 가장 큰 하위 트리의 합계를 출력하는 것입니다.접근 방법이 문제는 후위 순회(postorder traversal)를 활용하면 효율적으로 해결할 수 있습니다. 각 노드를 기준으로 왼쪽과 오른쪽 자식 서브트리의 정보를

  4. C++로 구현하는 최대 합 교대 부분 수열 알고리즘

    개요이 튜토리얼에서는 정수 배열이 주어졌을 때 최대 합 교대 부분 수열(maximum sum alternating subsequence)을 찾는 프로그램을 만들어 보겠습니다.여기서 교대 부분 수열이란 처음에는 감소하고, 그다음에는 증가하고, 다시 감소하는 식으로 값의 증감이 번갈아 나타나는 수열을 의미합니다. 목표는 이러한 조건을 만족하는 부분 수열 중에서 원소들의 합이 가장 커지는 경우를 찾는 것입니다.문제 이해하기예를 들어 배열이 {8, 2, 3, 5, 7, 9, 10}라고 가정해 봅시다. 이때 가장 유리한 교대 부분 수열은 8

  5. C++로 숫자의 M개 연속 자릿수 최대 합과 곱 구하기

    문제 개요 이 문제에서는 하나의 숫자를 나타내는 문자열이 주어집니다. 우리의 목표는 C++을 활용하여 숫자 안에서 M개의 연속된 자릿수를 선택했을 때 얻을 수 있는 최대 합(sum)과 최대 곱(product)을 구하는 프로그램을 작성하는 것입니다. 문제 설명 주어진 숫자에서 길이가 M인 모든 연속 부분 수열을 찾고, 각 부분 수열에 포함된 자릿수들의 합과 곱을 계산한 뒤, 그중 가장 큰 값을 반환합니다. 예시를 통해 문제를 자세히 이해해 보겠습니다. 입력 number = 2379641, M = 4 출력 maxSum = 26 maxP

  6. C++로 최대 합 비토닉 부분 배열 구하기

    이 문제에서는 배열 arr[]가 주어지며, 최대 합을 가지는 비토닉(bitonic) 부분 배열을 찾는 프로그램을 C++로 작성하는 것이 목표입니다.비토닉 부분 배열(Bitonic Subarray)이란 요소들이 먼저 엄격하게 증가하다가 특정 지점(정점)에 도달한 후 다시 엄격하게 감소하는 형태를 가진 특수한 부분 배열을 의미합니다.예시를 통해 문제를 자세히 살펴보겠습니다.입력arr[] = {4, 2, 3, 7, 9, 6, 3, 5, 1}출력30설명위 배열에서 비토닉 부분 배열은 [2, 3, 7, 9, 6, 3]입니다.합계 = 2 +

  7. C++로 구현하는 최대 합 바이토닉(Bi-tonic) 부분 수열

    이 문제에서는 배열 arr[]가 주어지며, C++을 사용해 이 배열에서 최대 합 바이토닉(Bi-tonic) 부분 수열을 찾는 프로그램을 작성하는 것이 목표입니다.바이토닉 부분 수열이란 원소들이 먼저 증가하다가 이후 감소하는 형태를 가지는 특수한 수열을 말합니다.문제 이해를 위한 예시입력arr[] = {4, 2, 3, 7, 9, 6, 3, 5, 1}출력33설명가장 큰 합을 가지는 바이토닉 부분 수열은 {2, 3, 7, 9, 6, 5, 1}이며, 그 합은 다음과 같습니다.합 = 2 + 3 + 7 + 9 + 6 + 5 + 1 = 33해결

  8. C++로 구현하는 최대 합 감소 부분 수열(MSDS) 알고리즘

    이 문제에서는 N개의 정수로 이루어진 배열 arr[]가 주어지며, 우리의 목표는 C++를 이용해 최대 합 감소 부분 수열(Maximum Sum Decreasing Subsequence)을 찾는 것입니다.문제 설명배열에서 원소들을 선택해 엄격하게 감소하는(각 원소가 앞선 원소보다 작은) 부분 수열을 만들 때, 그 합이 최대가 되는 경우를 구해야 합니다.예제를 통해 문제를 자세히 살펴보겠습니다.입력arr[] = {3, 1, 6, 10, 5, 2, 9}출력17설명합이 최대가 되는 감소 부분 수열은 {10, 5, 2}이며, 그 합은 10

  9. C/C++, Python, PHP, Java에서 두 변수 값을 한 줄로 교환하는 방법

    이 튜토리얼에서는 다양한 프로그래밍 언어에서 두 변수의 값을 서로 바꾸는 방법을 알아봅니다. 스왑(swap)이란 두 변수가 담고 있는 값을 서로 맞바꾸는 연산을 의미합니다. 먼저 간단한 예시로 살펴보겠습니다. 입력 a = 3 b = 5 출력 a = 5 b = 3 그럼 각 언어별로 하나씩 자세히 살펴보겠습니다. Python(파이썬) 파이썬은 단 한 줄의 코드로 두 변수를 교환할 수 있습니다. 튜플 언패킹(tuple unpacking) 문법 덕분인데요, 별도의 임시 변수 없이 우변의 값들을 좌변에 한 번에 대입할 수 있습니다. 코드를

  10. C++ 단어 약어 생성 알고리즘: 트라이(Trie)로 충돌 없는 최소 약어 만들기

    문제 소개서로 중복되지 않는 n개의 문자열로 이루어진 배열이 주어졌을 때, 아래 규칙에 따라 모든 단어에 대해 가능한 한 짧은 약어를 생성해야 합니다.기본 형식: 첫 글자로 시작하고, 생략된 문자의 개수가 이어지며, 마지막 글자로 끝납니다. (예: internationalization → i18n)충돌 처리: 두 개 이상의 단어가 동일한 약어를 공유하는 경우, 단어→약어 매핑이 고유해질 때까지 첫 글자 하나 대신 더 긴 접두사를 사용합니다.길이 조건: 약어가 원래 단어보다 짧아지지 않는다면 약어를 만들지 않고 원본 단어를 그대로 유

  11. C++ 동적 계획법으로 푸는 최대 휴가 일수 문제

    한 회사가 우수 직원 한 명에게 N개의 도시를 돌며 자원을 수집할 수 있는 기회를 주려고 합니다. 하지만 직원 역시 휴가가 필요하죠. 특정 도시와 특정 주(week)에만 휴가를 사용할 수 있을 때, 여행 일정을 잘 짜서 최대한 많은 휴가 일수를 확보하는 것이 우리의 과제입니다. 단, 몇 가지 규칙과 제약 조건을 반드시 따라야 합니다.문제 조건이동은 N개의 도시 사이에서만 가능하며, 각 도시는 0부터 N-1까지의 인덱스로 표현됩니다. 첫째 날(월요일)에는 인덱스 0번 도시에서 출발합니다.도시들은 항공편으로 연결되어 있습니다. N x

  12. C++로 해결하는 최대 평균 부분 배열 II 문제

    n개의 정수로 이루어진 배열이 주어졌을 때, 길이가 k 이상인 연속된 부분 배열 중에서 평균값이 가장 큰 경우를 찾아야 합니다. 즉, 조건을 만족하는 부분 배열의 최대 평균값을 구하는 것이 목표입니다.예를 들어 입력이 [1,12,-5,-6,50,3]이고 k = 4라고 가정해 보겠습니다. 길이가 5일 때 최대 평균은 10.8, 길이가 6일 때는 9.16667입니다. 따라서 정답은 12.75가 됩니다.문제 해결 접근 방법이 문제는 이분 탐색(Binary Search) 기법으로 효율적으로 해결할 수 있습니다. 핵심 아이디어는 평균값 x

  13. C++ 코인 경로(Coin Path) 문제: 최소 비용 점프 경로 찾기

    문제 이해 배열 A(인덱스는 1부터 시작)에 N개의 숫자 A1, A2, ..., AN이 들어 있고, 또 하나의 정수 B가 주어진다고 가정해 봅시다. 정수 B는 배열 A의 임의의 인덱스 i에서 i+1, i+2, ..., i+B 범위 안의 위치로 점프할 수 있음을 의미합니다. 또한 인덱스 i를 밟으면 Ai만큼의 코인을 지불해야 하며, Ai가 -1이라면 해당 위치로는 점프할 수 없습니다. 목표는 배열 A의 인덱스 1에서 출발하여 최소한의 코인으로 인덱스 N에 도달하는 것입니다. 우리는 최소 비용으로 인덱스 N까지 도달하기 위해 거쳐야

  14. C++에서 9가 포함된 정수 제거하기 — 9진법 변환으로 풀기

    문제 설명정수 n이 주어졌을 때, 다음 연산을 수행한 결과에서 n번째 정수를 반환해야 합니다. 정수 1부터 시작하여 9, 19, 29처럼 숫자 9를 포함하는 모든 정수를 제거하면 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, ... 과 같은 새로운 수열이 만들어집니다. 이때 1이 첫 번째 정수라는 점에 유의해야 합니다.예를 들어 입력이 9라면, 수열에서 9는 이미 제거되었으므로 9번째 정수는 10이 됩니다.접근 방법: 9진법 변환이 문제의 핵심 아이디어는 바로 9진수 변환입니다. 9를 포함하지 않는 수열은 각 자릿수가 0

  15. C++로 풀어보는 K 빈 슬롯(K Empty Slots) 문제

    문제 설명 N개의 전구가 일렬로 나열되어 있으며, 1부터 N까지 번호가 붙어 있다고 가정해 봅시다. 처음에는 모든 전구가 꺼져 있습니다. 우리는 매일 정확히 하나의 전구를 켜며, N일이 지나면 모든 전구가 켜지게 됩니다. 길이가 N인 배열 bulbs가 주어질 때, bulbs[i] = x라면 (i+1)번째 날에 위치 x에 있는 전구를 켠다는 의미입니다. 또 다른 정수 K가 주어졌을 때, 켜진 두 전구 사이에 꺼진 전구가 정확히 K개 존재하는 가장 이른 날짜를 구해야 합니다. 만약 그러한 날이 없다면 -1을 반환합니다. 예시 입력이

  16. C++로 풀어보는 고유한 섬 II(Distinct Islands II): 회전·반사까지 고려한 알고리즘

    문제 개요 비어 있지 않은 2차원 이진 배열 grid가 주어진다고 가정해 보겠습니다. 여기서 섬(island)은 상하좌우 4방향으로 연결된 1(육지)들의 그룹을 의미하며, 격자의 네 가장자리는 모두 물로 둘러싸여 있다고 가정합니다. 목표는 고유한 섬의 개수를 세는 것입니다. 두 섬이 다음 조건 중 하나라도 만족하면 서로 같은 섬으로 간주합니다. 모양이 완전히 동일한 경우 90도, 180도 또는 270도 회전했을 때 모양이 동일한 경우 좌우 방향 또는 상하 방향으로 반사했을 때 모양이 동일한 경우 예를 들어 입력이 다음과 같다면,

  17. C++로 구현하는 최소 윈도우 부분 수열(Minimum Window Subsequence)

    문제 정의 두 개의 문자열 S와 T가 주어졌을 때, T가 부분 수열(subsequence)이 되도록 하는 S의 최소 길이 부분 문자열(윈도우) W를 찾는 문제입니다. 만약 S 안에서 T의 모든 문자를 순서대로 포함하는 윈도우가 존재하지 않는다면 빈 문자열을 반환해야 하고, 조건을 만족하는 윈도우가 여러 개라면 그중 시작 인덱스가 가장 왼쪽에 있는 것을 반환해야 합니다. 예를 들어 입력이 S = "abcdebdde", T = "bde"라고 가정해 보겠습니다. 이 경우 출력은 "bcde&qu

  18. C++로 풀어보는 직원 공통 자유 시간(Employee Free Time) 문제

    문제 설명 여러 명의 직원 근무 일정(schedule) 목록이 주어졌다고 가정해 보겠습니다. 이 목록은 각 직원의 근무 시간을 나타내며, 각 직원은 서로 겹치지 않는 구간(interval)들의 리스트를 가지고 있고, 이 구간들은 이미 정렬되어 있다고 가정합니다. 우리가 구해야 하는 것은 모든 직원에게 공통으로 해당하면서 길이가 양수인 자유 시간(free time) 구간의 목록이며, 결과 역시 정렬된 순서로 반환해야 합니다. 구간은 [x, y] 형태로 표현합니다. 예를 들어 schedule[0][0].start = 1, schedu

  19. C++로 구현하는 기본 계산기 III — 괄호와 사칙연산이 포함된 수식 평가

    간단한 수식 문자열이 주어졌을 때, 해당 수식을 평가하는 기본 계산기를 구현해야 합니다. 수식 문자열에는 여는 괄호와 닫는 괄호, 덧셈(+)과 뺄셈(-) 부호, 음수가 아닌 정수, 그리고 공백이 포함될 수 있으며, 곱셈(*)과 나눗셈(/) 연산자도 함께 등장할 수 있습니다. 이때 정수 나눗셈은 0을 향해 절사(truncate toward zero)해야 합니다.예를 들어 입력이 6-4 / 2라면 출력은 4가 됩니다.접근 방법이 문제는 연산 우선순위가 서로 다른 두 단계(덧셈·뺄셈 / 곱셈·나눗셈)를 각각 별도의 변수 쌍으로 관리하고,

  20. C++로 푸는 주유소 간 최대 거리 최소화 문제 (이진 탐색 활용)

    수평선 위에 여러 개의 주유소가 있다고 가정해 봅시다. 이 수직선에는 stations[0], stations[1], ..., stations[N-1] 위치에 주유소가 배치되어 있으며, N은 배열의 크기입니다. 여기에 K개의 새로운 주유소를 추가하여, 인접한 주유소 사이 거리 중 최댓값인 D를 최소화하려고 합니다. 우리가 구해야 할 것은 가능한 D의 최솟값입니다.문제 예시예를 들어, 입력이 다음과 같다고 해보겠습니다:stations = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]K = 9이 경우 출력은 0.5가 됩니다.

Total 5981 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:190/300  20-컴퓨터/Page Goto:1 184 185 186 187 188 189 190 191 192 193 194 195 196