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

C++

  1. C++ 배열 요소 빈도 계산: O(n) 시간, O(1) 추가 공간으로 구현하는 방법

    문제 개요값이 1부터 n 사이인 정수 배열이 주어집니다. 일부 요소는 여러 번 반복되어 나타나고, 일부 요소는 아예 존재하지 않을 수도 있습니다. 이때 O(n) 시간과 O(1)의 추가 공간만 사용하여 배열에 있는 모든 요소의 빈도를 계산하는 것이 목표입니다.입력 예시 1Arr[] = { 1, 2, 2, 3, 4, 4, 4, 5 }출력 예시 11 → 1, 2 → 2, 3 → 1, 4 → 3, 5 → 1설명: 가장 큰 요소는 5이며, 출력은 각 숫자가 배열에 등장한 횟수를 나타냅니다.입력 예시 2Arr[] = { 1, 4, 4, 5,

  2. C++로 특정 조건을 만족하는 인덱스 쌍 개수 구하기

    문제 소개첫 N개의 자연수를 순열 형태로 나열한 배열이 주어졌을 때, 아래 조건을 만족하는 요소들의 인덱스 쌍을 찾는 것이 목표입니다.배열을 Arr[]이라 하고 i, j를 인덱스라고 할 때, 다음 식을 만족하는 요소 쌍의 개수를 구합니다.Arr[i] + Arr[j] = max(Arr[x]) (단, i ≤ x ≤ j)즉, Arr[i]와 Arr[j]의 합이 두 인덱스 사이 구간에서 가장 큰 값과 같아야 합니다.입력 예시 1Arr[]= { 2,4,1,3,6,5 }출력조건을 만족하는 인덱스 쌍의 개수: 1설명 − 각 쌍의 합은 다음과 같습

  3. C++로 배열 정렬에 필요한 '맨 앞으로 이동' 연산의 최소 횟수 구하기

    1부터 n까지의 숫자로 이루어진 배열이 주어졌을 때, 이 배열을 오름차순으로 정렬하는 데 필요한 맨 앞으로 이동(move-to-front) 연산의 최소 횟수를 구하는 것이 목표입니다. 배열에는 중복된 값이 없으며, 맨 앞으로 이동 연산이란 특정 요소를 선택하여 배열의 첫 번째 위치(인덱스 0)로 옮기는 작업을 의미합니다.문제를 해결하려면 배열을 뒤에서부터 앞으로 순회하면서 각 요소가 올바른 위치에 있는지 확인합니다. 올바른 위치에 있는 요소라면 추가 이동이 필요 없고, 그렇지 않다면 이동이 필요합니다. 1부터 n까지의 값을 가지는

  4. C++로 배열의 모든 값을 1로 만드는 최소 오른쪽 뒤집기 횟수 계산하기

    0과 1로 구성된 배열이 주어지며, 각 값은 순서대로 하나의 회선에 연결된 전구의 상태를 나타냅니다. 0은 전구가 꺼져 있음(OFF)을, 1은 켜져 있음(ON)을 의미합니다. N개의 전구로 이루어진 시퀀스에서 i번째 전구의 스위치를 누르면, 그 오른쪽에 있는 모든 전구(i+1번째부터 n번째까지)의 상태가 반전됩니다. 즉, 켜져 있던 전구는 꺼지고 꺼져 있던 전구는 켜집니다. 목표는 주어진 전구 상태에서 모든 전구를 켜기 위해 눌러야 하는 최소 스위치 횟수를 구하는 것입니다. 단, 같은 스위치는 몇 번이든 다시 누를 수 있습니다. 이

  5. C++로 목표 배열을 만드는 최소 연산 횟수 구하는 방법

    이 문제에서는 숫자로 이루어진 target[] 배열이 주어집니다. 모든 요소가 0인 배열 [0,0,0,…]을 아래 두 가지 연산만 사용하여 목표 배열로 변환할 때 필요한 최소 단계 수를 구해야 합니다. 증가 연산 — 모든 요소를 1씩 증가시킬 수 있으며, 각 증가 연산은 개별적으로 단계에 포함됩니다. (n개의 요소를 n번 증가시키면 단계 수 = n) 배가 연산 — 배열 전체를 한 번에 두 배로 만듭니다. 모든 요소에 대해 한 번만 계산됩니다. (각 배가 연산은 모든 요소의 값을 두 배로 만들며, 단계 수 1로 계산) 목표는 목표

  6. C++에서 오름차순으로 정렬되지 않은 열의 개수 구하기

    길이가 모두 동일한 문자열 배열이 주어졌을 때, 오름차순으로 정렬되어 있지 않은 열(column)의 개수를 구하는 것이 목표입니다. 여기서 열이란 각 문자열에서 같은 위치에 있는 문자들의 집합을 의미합니다. 즉, 첫 번째 문자열의 첫 문자와 두 번째 문자열의 첫 문자를 비교하고, 이러한 방식으로 마지막 문자열까지 비교하여 오름차순이 아니라면 카운트를 증가시킵니다. 이 작업을 두 번째 문자, 세 번째 문자에 대해서도 차례로 반복합니다. 입력 예시 1 Arr[] = { abc, bcd, def } 출력 정렬되지 않은 열의 개수: 0

  7. C++ 배열 회전으로 숫자를 연결해 만들 수 있는 최댓값 구하기

    이번 글에서는 원형 배열(Circular Array)에 담긴 숫자들을 회전시켜 연결함으로써 만들 수 있는 최댓값을 구하는 방법을 다룹니다. 먼저 문제 상황과 해결 전략을 살펴보고, 이어서 실제 동작하는 C++ 코드까지 확인해 보겠습니다.문제 개요원형 배열이란 첫 번째 요소가 마지막 요소 바로 다음에 위치한다고 간주되는 배열을 말합니다. 즉, 배열의 끝과 시작이 이어져 있는 형태로, 주로 큐(Queue)를 구현할 때 활용됩니다.배열의 각 요소는 자릿수가 같거나 서로 다를 수 있습니다. 우리의 목표는 필요하다면 요소들의 순서를 회전시키

  8. C++로 구현하는 최대 거울 문제: 아래에서 오른쪽으로 빛을 전달하는 거울 개수 찾기

    문제 소개0과 1로만 구성된 정사각형 행렬이 주어집니다. 여기서 0은 빈 칸(비어 있는 자리)을 의미하고, 1은 장애물을 나타냅니다. 우리의 목표는 빈 칸에 거울을 배치했을 때, 빛을 아래(bottom)에서 오른쪽(right)으로 전달할 수 있는 거울의 최대 개수를 구하는 것입니다.거울이 특정 셀 [i, j]에 배치될 수 있는 조건은 다음과 같습니다.같은 행(i)에서 해당 셀의 오른쪽에 있는 모든 셀에 장애물이 없어야 합니다.같은 열(j)에서 해당 셀의 아래쪽에 있는 모든 셀에 장애물이 없어야 합니다.즉, 거울이 A[i][j]에 있

  9. C++에서 ax + by + cz = n 조건을 만족하며 x + y + z의 합을 최대화하는 방법

    정수 a, b, c, n이 주어졌을 때, 방정식 ax + by + cz = n을 만족하면서 x + y + z의 합이 최대가 되는 경우를 찾는 것이 목표입니다. 공식 유도 방정식을 z에 대해 정리하면 다음과 같습니다. cz = n − (ax + by) z = (n − (ax + by)) / c x와 y의 값을 하나씩 고정한 뒤 위 공식으로 z를 계산하고, 각 조합(x, y, z)마다 합을 구하여 그중 최댓값을 저장하면 됩니다. 입력 및 출력 예시 예시 1 n = 6, a = 3, b = 4, c = 5; 출력: x + y + z의 최

  10. C++에서 i < j < k < l 조건으로 arr[j] - arr[i] + arr[l] - arr[k]의 최댓값 구하기

    문제 개요정수 배열이 주어졌을 때, 인덱스가 i < j < k < l 조건을 만족하도록 하면서 다음 표현식의 값을 최대화하는 것이 목표입니다.arr[j] - arr[i] + arr[l] - arr[k]가장 직관적인 해결 방법은 배열의 모든 요소를 순회하며 가능한 인덱스 조합마다 표현식 값을 계산하는 것입니다. 계산한 값이 지금까지 찾은 최댓값보다 크면 저장해 두고, 탐색이 끝나면 그 값을 반환합니다.예제 1arr[] = { 1, 2, 3, 4 }출력:위 표현식의 최댓값 : 2설명: i < j < k <

  11. C++에서 그리드 내 3x3 마방진 개수 세기

    개요 주어진 숫자 행렬(그리드) 안에서 3x3 크기의 마방진(Magic Square)이 몇 개 존재하는지 찾는 문제입니다. 마방진은 1부터 9까지의 숫자가 각각 한 번씩만 나타나며, 모든 행, 열, 대각선의 합이 15가 되는 3x3 정사각형을 말합니다. 마방진의 정의와 조건 3x3 마방진이 되기 위한 필수 조건은 다음과 같습니다. 1부터 9까지의 정수가 중복 없이 정확히 한 번씩 등장한다. 모든 숫자의 합은 45이다 (1+2+...+9). 각 행의 합 = 15 각 열의 합 = 15 두 대각선의 합 = 15

  12. L = {aⁿbᵐa⁽ⁿ⁺ᵐ⁾ | n, m ≥ 1} 언어를 인식하는 튜링 머신 구성하기

    튜링 머신(Turing Machine)이란?튜링 머신은 0형 문법(type 0 grammar)으로 생성되는 언어의 문자열을 받아들이기 위해 사용되는 장치입니다. 튜링 머신(TM)은 입력이 주어지는 셀(cell)로 구분된 무한한 길이의 테이프로 이루어진 수학적 모델로, 입력 테이프를 읽는 헤드(head)를 가집니다. 상태 레지스터(state register)는 튜링 머신의 현재 상태를 저장합니다. 입력 기호를 하나 읽으면 그 기호를 다른 기호로 교체하고, 내부 상태를 변경한 뒤, 오른쪽 또는 왼쪽 셀로 이동합니다. TM이 최종 상태(

  13. C++에서 다른 배열의 요소로 정렬된 배열을 복원하는 최대값 찾기

    숫자로 이루어진 배열 Arr1[]과 길이가 같거나 다른 또 다른 배열 Arr2[]가 주어집니다. Arr1[]은 오름차순으로 정렬되어 있지만 단 하나의 요소만 제자리에 있지 않습니다. 우리는 Arr2[]에서 Arr1[]의 잘못 배치된 요소를 대체하여 전체 배열을 다시 정렬 상태로 만들 수 있는 값을 찾아야 하며, 후보가 여러 개라면 그중 가장 큰 값을 선택해야 합니다.입력Arr1[]= { 1,3,5,7,2,11 }, Arr2[]= { 4,8,7,10,9 }출력Arr1을 정렬 상태로 만들 수 있는 최대 요소: 10설명 − Arr2[]에

  14. C++에서 N루피로 구입할 수 있는 최대 물의 양 구하기

    문제 설명 N루피가 주어졌을 때, 이 돈으로 최대한 많은 물을 구입하는 것이 목표입니다. 물병의 종류에 따라 가격이 다르며, 각 병의 용량은 모두 1리터입니다. 플라스틱 병: 1리터당 A루피 유리 병: 1리터당 B루피 빈 병 반납: 유리 병을 반납하면 개당 E루피를 환불받을 수 있음 유리 병은 사용 후 반납하면 E루피를 돌려받으므로, 실질적인 구입 비용은 B-E루피가 됩니다. 따라서 최적의 구입 전략은 다음과 같습니다. 플라스틱 병 가격(A)이 여전히 B-E보다 저렴하다면 플라스틱 병만 구입합니다. 그렇지 않다면 유리 병을 우

  15. C++에서 인접 문자 교체 및 제거로 구하는 균형 괄호 문자열의 최대 길이

    문제 개요 (,),{},[] 여섯 종류의 괄호 문자만으로 구성된 문자열이 주어집니다. 목표는 인접한 문자를 서로 교체하거나 불필요한 문자를 제거하여 문자열 전체가 균형 상태가 되도록 만들 때, 얻을 수 있는 균형 문자열의 최대 길이를 구하는 것입니다. 인접한 두 문자가 서로 반대 방향의 짝이라면 자유롭게 교체할 수 있습니다. 예를 들어 }{, )(][ 는 맞바꿀이 가능하지만, {{, ((, [[}}, ))]]처럼 같은 방향의 문자끼리는 교체할 수 없습니다. 또한 짝을 이루지 못한 문자는 제거할 수도 있습니다. 예를 들어 “{{}][

  16. 콘텐츠 관리 시스템(CMS)이란? 핵심 개념부터 주요 기능까지 총정리

    콘텐츠 관리 시스템(Content Management System)이라는 용어를 문자 그대로 풀어보면 콘텐츠를 관리하는 체계를 뜻합니다. 즉, CMS는 웹 콘텐츠를 손쉽고 효율적으로 제작, 디자인, 게시, 유지보수할 수 있도록 다양한 기능을 갖춘 협업 플랫폼입니다.콘텐츠 관리 시스템(CMS)이란?콘텐츠 관리 시스템은 온라인에서 웹 콘텐츠를 만들고 디자인하는 데 사용되는 소프트웨어 애플리케이션입니다. 데이터베이스 처리, 스마트 리포팅, 아카이빙, 디자인 및 애니메이션 기능 등에 접근할 수 있게 해주어 사용자가 디지털 콘텐츠를 쉽게 관

  17. C++로 배우는 교란 순열(Derangement) 개수 세기 — 완전 탐색부터 재귀 풀이까지

    교란 순열(Derangement)은 N개의 숫자 중 어떤 숫자도 자기 자신의 원래 위치에 있지 않도록 배열한 순열을 말합니다. 예를 들어 { 1, 2, 3 }의 교란 순열 중 하나는 { 2, 3, 1 }입니다. 이 배열에서 어떤 요소도 원래 인덱스(0, 1, 2)에 위치하지 않기 때문입니다. 이 글에서는 재귀(Recursion)를 활용해 N개의 숫자에 대해 가능한 교란 순열의 개수를 구하는 방법을 알아보겠습니다. 교란 순열의 기본 규칙 요소 개수별 교란 순열의 개수를 살펴보면 다음과 같은 패턴을 발견할 수 있습니다. N = 0 :

  18. C++로 이해하는 연속 트리(Continuous Tree) 개념과 판별 알고리즘

    연속 트리란 무엇인가?연속 트리(Continuous Tree)는 루트 노드에서 리프 노드로 이어지는 모든 경로에서, 부모 노드와 그 직계 자식 노드들 사이의 값(가중치) 차이의 절댓값이 항상 1이 되는 트리를 의미합니다.루트에서 리프까지의 경로에 있는 임의의 노드를 골랐을 때 다음 조건이 반드시 성립해야 합니다.|부모 노드의 값 − 왼쪽 자식 노드의 값| = 1|부모 노드의 값 − 오른쪽 자식 노드의 값| = 1예제로 이해하기아래 트리는 모든 부모 노드와 자식 노드 사이의 절댓값 차이가 항상 1이므로 연속 트리에 해당합니다.반면 아

  19. C++에서 중위(Inorder)·전위(Preorder) 순회 결과로 이진 트리 재구성하기

    이진 트리의 중위 순회(Inorder)와 전위 순회(Preorder) 결과가 주어졌을 때, 두 순회 정보를 바탕으로 원래의 트리를 다시 구성하는 것이 이 글의 목표입니다.중위 순회(Inorder Traversal)란?중위 순회는 왼쪽 서브트리 → 루트 노드 → 오른쪽 서브트리 순서로 방문하는 순회 방식입니다.Inorder(tree root)루트가 가리키는 노드의 왼쪽 서브트리를 먼저 순회합니다. → inorder(root→left) 호출루트 노드 자신을 방문합니다.마지막으로 오른쪽 서브트리를 순회합니다. → inorder(root→

  20. C++로 이진 트리에서 만들 수 있는 최대 길이 사이클 구하기

    이진 트리가 하나 주어졌을 때, 해당 트리에서 형성할 수 있는 최대 길이의 사이클(cycle)을 찾는 것이 이 글의 목표입니다. 핵심 아이디어는 간단합니다. 루트 노드를 기준으로 왼쪽 서브트리와 오른쪽 서브트리의 최대 높이를 각각 구한 뒤, 이 두 경로를 루트를 통해 연결하면 가장 긴 사이클을 얻을 수 있습니다. 예를 들어 위 트리에서 최대 길이 사이클은 1-2-3-4-7-6 또는 1-6-7-4-3-2-1이며, 그 길이는 6입니다. 입력 및 출력 예시 예시 1 입력 − 트리 출력 − 최대 사이클 길이: 5 설명 − 왼쪽 서브트리

Total 5981 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:200/300  20-컴퓨터/Page Goto:1 194 195 196 197 198 199 200 201 202 203 204 205 206