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

C++

  1. C++에서 두 배열의 합을 동일하게 만드는 요소 교환 쌍 찾는 방법

    서로 다른 개수의 요소를 가진 두 배열이 있다고 가정해 보겠습니다. 우리가 찾아야 하는 것은 쌍 (x, y)입니다. 여기서 x는 첫 번째 배열에 있는 값이고, y는 두 번째 배열에 있는 값입니다. 이 두 요소를 배열 간에 서로 교환했을 때 두 배열의 합이 같아지도록 쌍을 선택해야 합니다.예를 들어, 첫 번째 배열 A가 [4, 1, 2, 2, 1, 1]을 담고 있고, 두 번째 배열 B가 [3, 3, 6, 3]을 담고 있다고 합시다. 이때 A의 합은 11, B의 합은 15입니다. 여기서 (1, 3)이라는 쌍을 선택하여 두 값을 서로 교

  2. C++로 정수 배열에서 최대 곱을 가지는 쌍 찾기

    배열 A에 n개의 서로 다른 원소가 있다고 가정해 봅시다. 우리의 목표는 배열 A에서 두 원소의 곱이 최대가 되는 쌍 (x, y)을 찾는 것입니다. 이때 배열에는 양수와 음수가 함께 포함될 수 있습니다.예를 들어 배열이 A = [-1, -4, -3, 0, 2, -5]와 같다면, 최대 곱을 만드는 쌍은 (-4, -5)입니다. 두 음수를 곱하면 양수가 되며, 그 결과인 20이 이 배열에서 만들 수 있는 최대 곱이기 때문입니다.문제 해결 접근 방식이 문제를 효율적으로 해결하려면 배열을 한 번만 순회하면서 다음 네 가지 값을 추적해야 합니

  3. C++에서 주어진 차이를 가진 쌍(Pair) 찾기: 투 포인터 알고리즘

    서로 다른 n개의 원소로 구성된 배열 A가 있다고 가정해 봅시다. 우리는 배열 A에서 두 원소의 차이가 주어진 값 d와 정확히 일치하는 쌍(x, y)을 찾아야 합니다. 예를 들어 배열이 A = [10, 15, 26, 30, 40, 70]이고 목표 차이가 30이라면, 조건을 만족하는 쌍은 (10, 40)과 (40, 70)입니다. 투 포인터(Two Pointers)를 활용한 접근 방식 이 문제는 배열이 오름차순으로 정렬되어 있다고 가정하면 투 포인터 기법으로 매우 효율적으로 해결할 수 있습니다. 왼쪽부터 두 개의 포인터를 사용하는데,

  4. C++로 맨해튼 거리의 합이 최소화되는 점 찾기

    K차원 공간에 서로 다른 n개의 점이 있다고 가정해 보겠습니다. 여기서 n은 2 이상 10^5 이하의 범위를 가지며, 차원의 개수 k는 1부터 5 사이입니다. 우리가 구해야 할 것은 결과 점에서 n개의 점까지의 맨해튼 거리(Manhattan Distance)의 합이 최소가 되는 점입니다.두 점 P1(x1, y1)과 P2(x2, y2) 사이의 맨해튼 거리는 |x1 – x2| + |y1 – y2|로 정의됩니다. 예를 들어 차원이 3이고 세 개의 점 (1, 1, 1), (2, 2, 2), (3, 3, 3)이 주어진 경우, 출력은 (2,

  5. C++로 기하 평균이 최대가 되는 부분집합 구하기

    문제 개요여러 개의 원소를 가진 배열 A가 주어졌을 때, 기하 평균(geometric mean)이 가장 커지는 부분집합을 찾아야 합니다.예를 들어 A = [1, 5, 7, 2, 0]이라면, 기하 평균이 가장 큰 부분집합은 [5, 7]이 됩니다.접근 방식이 문제는 한 가지 간단한 트릭으로 해결할 수 있습니다. 실제로 기하 평균을 계산할 필요가 없다는 점입니다.기하 평균은 n개의 수의 곱에 n제곱근을 취한 값인데, 현재 기하 평균보다 작은 값을 새로 추가하면 오히려 기하 평균이 낮아집니다. 따라서 원소를 더 추가하는 것은 도움이 되지

  6. C++로 N차 대칭 행렬 만들기: 각 행에 0부터 N-1까지의 숫자를 포함하고 주대각선은 0으로 채우기

    개요이 글에서는 C++를 사용하여 N차(N×N) 대칭 행렬을 생성하는 방법을 알아봅니다. 생성해야 할 행렬의 조건은 다음과 같습니다.각 행에는 0부터 N-1까지의 숫자가 포함되어야 합니다.주대각선(main diagonal)의 모든 요소는 항상 0이어야 합니다.예를 들어 N이 5라면, 첫 번째 행은 0, 1, 2, 3, 4가 되고, 두 번째 행은 자기 자신의 위치(대각선)만 0이며 나머지는 순서대로 숫자가 채워집니다.알고리즘 접근 방식이 문제는 비교적 간단하게 해결할 수 있습니다. 핵심 로직은 다음과 같습니다.N×N 크기의 2차원 배

  7. C++로 이진 트리에서 모든 중복 서브트리 찾기

    이진 트리(binary tree)가 하나 주어져 있다고 가정해 봅시다. 우리가 해야 할 일은 이 트리 안에 중복된 서브트리(하위 트리)가 존재하는지 확인하고, 있다면 해당 서브트리들을 모두 찾아내는 것입니다.예를 들어 아래와 같은 이진 트리가 있다고 합시다.이 트리에는 크기 2짜리 동일한 서브트리가 두 개 존재합니다. 또한 각 서브트리 내부를 살펴보면, 노드 D 그 자체와 BD, BE 역시 중복되는 서브트리에 해당합니다.접근 방법: 트리 직렬화와 해싱이 문제는 트리 직렬화(serialization)와 해싱(hashing) 기법을 활

  8. C++에서 n 이하의 모든 팩토리얼 수를 찾는 방법

    이 글에서는 n보다 작거나 같은 모든 팩토리얼 수(계승 수)를 출력하는 방법을 알아보겠습니다. 어떤 수 N이 양의 정수의 계승(팩토리얼)으로 표현될 수 있다면, 그 수를 팩토리얼 수라고 부릅니다. 예를 들어 1, 2, 6, 24, 120 등이 팩토리얼 수에 해당합니다.접근 방법팩토리얼 수를 구하기 위해 매번 팩토리얼을 직접 계산할 필요는 없습니다. 더 효율적인 방법은 i = 1부터 시작하여 이전 팩토리얼 값에 i를 곱해 나가는 것입니다. 초기 팩토리얼 값은 1로 설정하고, 계산된 값이 n 이하인 동안 출력을 반복하면 됩니다.이 방식

  9. C++로 배열에서 a % b = k를 만족하는 모든 쌍 (a, b) 찾기

    배열 A가 주어졌을 때, 배열의 원소들 중에서 a % b = k 조건을 만족하는 모든 쌍 (a, b)을 찾아야 합니다.예를 들어 배열이 A = [2, 3, 4, 5, 7]이고 k = 3이라면, 조건을 만족하는 쌍은 (7, 4), (3, 4), (3, 5), (3, 7)입니다. 각 쌍에서 첫 번째 원소를 두 번째 원소로 나눈 나머지가 정확히 k가 되는지 확인하면 됩니다.해결 접근 방식이 문제는 비교적 단순한 방법으로 해결할 수 있습니다. 배열의 모든 원소 쌍을 순회하면서 각 쌍에 대해 나머지 연산 결과가 k와 일치하는지 검사하고, 일

  10. C++로 ab = cd를 만족하는 배열의 두 쌍 (a, b)와 (c, d) 찾는 방법

    문제 개요배열 A가 주어졌을 때, 이 배열에서 두 쌍 (a, b)와 (c, d)를 선택하여 곱이 서로 같아지도록 하는, 즉 ab = cd를 만족하는 모든 쌍을 찾는 문제입니다.예를 들어 배열 A = [3, 4, 7, 1, 2, 9, 8]이 주어진다면 정답은 (4, 2)와 (1, 8)입니다. 두 쌍의 곱이 각각 4×2 = 8, 1×8 = 8로 동일하기 때문입니다.접근 방법: 해시 테이블 활용모든 네 원소 조합을 일일이 비교하는 브루트 포스 방식은 시간 복잡도가 O(n⁴)까지 늘어날 수 있어 비효율적입니다. 대신 가능한 모든 쌍의 곱을

  11. C++로 혼합물의 목표 비율을 맞추기 위해 추가해야 할 물의 양 구하기

    크기가 X인 용기에 물과 다른 액체가 섞여 있는 혼합물이 들어 있다고 가정해 봅시다. 이 혼합물에는 물이 W% 포함되어 있습니다. 이때 물의 비율을 Y%까지 높이려면 물을 얼마나 더 넣어야 할까요?예를 들어 X = 125, W = 20, Y = 25라면, 결과는 약 8.33리터가 됩니다.수식 유도기존 혼합물에 A만큼의 물을 추가한다면, 새로운 총량은 X + A가 됩니다. 따라서 혼합물 속 물의 양은 다음 공식으로 표현할 수 있습니다.기존 물의 양 + A = (X의 W%) + A동시에 새로운 혼합물에서 물의 양은 전체의 Y%와 같아야

  12. C++로 3×3 마방진 완성하기: 행·열·대각선의 합이 같아지도록 빈 대각선 채우기

    3×3 크기의 행렬이 하나 주어져 있고, 대각선 요소는 아직 비어 있다고 가정해 보겠습니다. 우리가 해야 할 일은 이 빈 대각선 자리를 적절한 값으로 채워서 모든 행, 열, 대각선의 합이 서로 같아지도록 만드는 것입니다. 이렇게 완성된 행렬은 흔히 마방진(Magic Square)이라고 불립니다. 예를 들어 다음과 같은 행렬이 입력으로 주어졌다고 합시다. 대각선을 모두 채우고 나면 결과는 다음과 같습니다. 풀이 접근 방식 비어 있는 대각선 요소를 각각 x, y, z라고 두겠습니다. 여기서 x는 좌상단 M[1,1], y는 중앙 M

  13. C++로 x와 자릿수의 합이 n이 되는 수 x 찾는 방법

    이번 글에서는 숫자 n이 주어졌을 때, 그 수 자신과 각 자릿수의 합을 더한 결과가 n과 같아지는 또 다른 수 x를 찾는 문제를 다뤄보겠습니다.예를 들어 n의 값이 21이라면 정답은 x = 15입니다. 15의 자릿수 합은 1 + 5 = 6이고, 15 + 6 = 21이므로 조건을 만족하기 때문입니다.문제 해결 접근 방법이 문제는 아주 단순한 방법으로 풀 수 있습니다. 1부터 n까지의 모든 수를 차례로 검사하며, 현재 검사 중인 수 i에 대해 “i + i의 자릿수 합”이 n과 같은지 확인합니다. 조건을 만족하는 값을 찾는 즉시 해당 값

  14. C++로 배열에서 모든 요소를 나눌 수 있는 요소 찾기

    개요여러 개의 요소를 가진 배열 A가 있다고 가정해 봅시다. 이때 배열 A에 속한 요소 중에서 나머지 모든 요소를 나눌 수 있는(즉, 모든 요소가 해당 값으로 나누어 떨어지는) 값을 찾아야 합니다.예를 들어 배열이 [15, 21, 69, 33, 3, 72, 81]과 같다면, 모든 숫자가 3으로 나누어 떨어지므로 정답은 3이 됩니다.접근 방법이 문제는 다음과 같은 간단한 아이디어로 해결할 수 있습니다.배열 A에서 가장 작은 수를 찾습니다. 어떤 수가 다른 모든 수를 나눌 수 있다면, 그 수는 반드시 최솟값의 약수여야 하기 때문입니다.

  15. C++로 구현하는 배열 분할 문제: 왼쪽 합과 오른쪽 합이 같아지는 기준 요소 찾기

    문제 개요n개의 요소를 가진 배열 A가 주어졌을 때, 이 배열을 두 개의 부분 배열로 나누되 각 부분 배열의 합이 서로 같아지도록 하는 분할 기준 요소(partition element)를 찾는 것이 목표입니다.예를 들어 배열 A = [2, 3, 4, 1, 4, 5]가 있다고 가정해 보겠습니다. 이 경우 정답은 1입니다. 왜냐하면 1을 기준으로 앞부분은 [2, 3, 4](합계 9), 뒷부분은 [4, 5](합계 9)로 나뉘어 양쪽의 합이 동일하기 때문입니다.접근 방법이 문제는 다음과 같은 단계로 효율적으로 해결할 수 있습니다.먼저 첫

  16. C++로 괄호 문자열의 등점(Equal Point) 찾는 방법

    괄호 문자열의 등점(Equal Point)이란?이번 글에서는 C++를 활용해 괄호 문자열에서 등점(equal point)을 찾는 방법을 알아보겠습니다. 등점이란 특정 인덱스 i를 기준으로, 그 앞쪽에 있는 여는 괄호 (의 개수와 그 뒤쪽에 있는 닫는 괄호 )의 개수가 정확히 일치하는 지점을 의미합니다.예를 들어 괄호 문자열이 (()))(()()())))라고 가정해 보겠습니다. 각 인덱스별 문자를 자세히 살펴보면 다음과 같습니다.인덱스 : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14문자 : ( ( ) ) ) (

  17. C++ STL 활용: std::vector에서 중복 단어를 찾아 출력하는 방법

    문자열들이 담긴 리스트가 있다고 가정해 보겠습니다. 이 리스트에는 중복된 문자열이 일부 포함되어 있으며, 우리는 어떤 문자열이 두 번 이상 등장했는지 찾아 화면에 출력해야 합니다.예를 들어 문자열 리스트가 [Hello, Kite, Hello, C++, Tom, C++]와 같다면, 결과로 Hello와 C++이 출력되어야 합니다.접근 방법: 해싱(Hashing) 기법 활용이 문제는 해싱 기법을 사용하면 효율적으로 해결할 수 있습니다. 알고리즘의 흐름은 다음과 같습니다.빈 해시 테이블 역할을 하는 std::unordered_set을 생성

  18. C++로 인접한 두 변의 벡터가 주어졌을 때 평행사변형의 면적 구하기

    평행사변형의 인접한 두 변에 해당하는 두 벡터가 x̂i + ŷj + ẑk 형태로 주어져 있다고 가정해 봅시다. 이때 우리가 해야 할 일은 바로 평행사변형의 면적을 구하는 것입니다.기하학적으로 중요한 사실은, 평행사변형의 면적은 두 벡터의 외적(cross product)의 크기(|A × B|)와 같다는 점입니다. 따라서 복잡한 기하 계산 없이도 벡터 연산만으로 면적을 손쉽게 구할 수 있습니다.벡터 A = x1̂i + y1̂j + z1̂k 와 벡터 B = x2̂i + y

  19. C++로 인접한 두 변의 벡터를 이용해 삼각형 넓이 구하기

    3차원 공간에서 삼각형의 인접한 두 변을 나타내는 벡터가 각각 xî + yĵ + zk̂ 형태로 주어졌다고 가정해 보겠습니다. 이 글에서는 C++를 사용하여 이 두 벡터로부터 삼각형의 넓이를 구하는 방법을 알아보겠습니다.수학적 원리두 벡터가 삼각형의 인접한 두 변이라면, 삼각형의 넓이는 두 벡터의 외적(cross product) 크기의 절반과 같습니다. 외적의 결과는 두 벡터 모두에 수직인 새로운 벡터이며, 그 크기(|A × B|)는 두 벡터가 이루는 평행사변형의 넓이에 해당합니다. 따라서 여기에 ½를 곱하면 삼각형의 넓이를 얻을 수

  20. C++에서 ceil() 함수 없이 a/b의 올림 값 구하는 방법

    이 글에서는 C++의 ceil() 함수를 사용하지 않고 a/b의 올림(ceiling) 값을 구하는 방법을 알아봅니다. 예를 들어 a = 5, b = 4라면 a/b = 5/4 = 1.25이며, 이 값의 올림은 2가 됩니다.핵심 공식별도의 라이브러리 함수 호출 없이도 다음과 같은 간단한 정수 연산 공식만으로 올림 값을 계산할 수 있습니다.$$ceil\lgroup a,b\rgroup=\frac{a+b-1}{b}$$동작 원리C++에서 정수 나눗셈은 소수점 이하를 버리는 특성이 있습니다. 분자에 (b - 1)을 미리 더해두면, 나눗셈 과정에

Total 5981 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:87/300  20-컴퓨터/Page Goto:1 81 82 83 84 85 86 87 88 89 90 91 92 93