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

C++

  1. C++로 주어진 좌표 집합에서 만들 수 있는 직사각형의 최소 넓이 구하기

    XY 평면 위에 여러 점들이 배열 형태로 주어져 있다고 가정해 봅시다. 이 점들로 만들 수 있는 직사각형 중 가장 작은 넓이를 구하는 것이 목표입니다. 단, 직사각형의 변은 반드시 X축과 Y축에 각각 평행해야 하며, 직사각형을 만들 수 없는 경우에는 0을 반환해야 합니다.예를 들어 점들의 배열이 [(1, 1), (1, 3), (3, 1), (3, 3), (2, 2)]와 같다면 결과는 4가 됩니다. 점 (1, 1), (1, 3), (3, 1), (3, 3) 네 개를 꼭짓점으로 하는 직사각형이 만들어지기 때문입니다. 가로 길이가 2,

  2. C++로 모든 책 구매 최소 비용 구하는 방법

    n개의 요소를 가진 배열이 있다고 가정해 보겠습니다. 이 배열에는 각 책의 평점이 담겨 있습니다. 우리의 목표는 다음 조건을 만족하면서 모든 책을 구입할 때 드는 최소 비용을 구하는 것입니다.각 책의 비용은 최소 1달러 이상이어야 합니다.어떤 책의 평점이 인접한(왼쪽 또는 오른쪽) 책보다 높다면, 해당 책의 비용 역시 인접한 책보다 높아야 합니다.문제 예시예를 들어 평점 배열이 [1, 3, 4, 3, 7, 1]과 같이 주어졌다고 해봅시다. 이 경우 정답은 10이 됩니다. 실제 비용 계산은 1 + 2 + 3 + 1 + 2 + 1 =

  3. C++로 배열에서 자신보다 큰 요소가 두 개 이상인 모든 원소 찾기

    n개의 숫자로 이루어진 배열이 있다고 가정해 봅시다. 이때 배열 안에서 자신보다 큰 요소가 최소 두 개 이상 존재하는 모든 원소를 찾아야 합니다. 예를 들어 배열이 A = [2, 8, 7, 1, 5]라면 결과는 [2, 1, 5]가 됩니다. 2, 1, 5는 각각 8, 7처럼 자신보다 큰 값을 두 개 이상 가지고 있기 때문입니다.문제 해결 접근 방법이 문제는 정렬 없이도 선형 시간에 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.배열을 한 번 순회하며 최댓값(first_max)과 두 번째로 큰 값(second_max)을 구합니다

  4. C++로 두 문자열의 최장 공통 접두사를 만드는 최소 회전(시프트) 횟수 구하기

    두 개의 문자열 A와 B가 있고, 두 문자열의 길이는 서로 같다고 가정해 보겠습니다. 한 번의 시프트(shift) 연산으로 문자열 B를 한 칸씩 회전할 수 있으며, 목표는 A와 B 사이의 공통 접두사(prefix) 길이를 최대화하기 위해 필요한 최소 시프트 횟수를 구하는 것입니다.예를 들어 A = programminglanguage, B = computerprogramming이라고 할 때, B를 왼쪽으로 8번 회전하면 programmingcomputer가 되어 A와의 공통 접두사가 programming(길이 11)으로 최대가 됩니다

  5. C++로 1부터 N까지 거의 소수(Almost Prime) 개수 구하기

    자연수 N이 주어졌을 때, 1부터 N 사이에 존재하는 거의 소수(almost prime)의 개수를 구하는 것이 목표입니다. 거의 소수란 서로 다른 소인수를 정확히 두 개 가지는 수를 의미합니다. 이때 소수가 아닌 약수는 몇 개가 있더라도 상관없으며, 핵심은 서로 다른 소수 인수가 정확히 두 개여야 한다는 점입니다. 예를 들어 N이 10이라면 정답은 2입니다. 해당 범위에서 조건을 만족하는 수는 6(= 2 × 3)과 10(= 2 × 5) 두 개뿐이기 때문입니다. 접근 방법 – 에라토스테네스의 체 활용 이 문제는 에라토스테네스의 체(

  6. C++ 동적 계획법으로 연속된 세 요소마다 하나씩 선택할 때 최소 합 구하기

    문제 개요n개의 요소로 이루어진 배열이 있다고 가정해 보겠습니다. 이때 우리가 구해야 할 것은 배열 요소들의 최소 합이며, 단 하나의 조건이 붙습니다. 바로 연속된 세 개의 요소로 이루어진 구간마다 적어도 하나의 요소를 반드시 선택해야 한다는 것입니다.예를 들어 배열이 [1, 2, 3, 6, 7, 1]이라면 출력은 4가 됩니다. 3과 1을 선택하면 3 + 1 = 4이기 때문입니다. 이 배열에서 확인해야 하는 연속 구간은 [1, 2, 3], [2, 3, 6], [3, 6, 7], [6, 7, 1]이며, 각 구간에서 하나씩 요소를 골랐

  7. C++에서 요소 범위 제한 없이 배열의 중복 요소 찾기

    N개의 정수로 구성된 배열이 있다고 가정해 보겠습니다. 이 글에서는 주어진 배열 안의 중복 요소를 모두 찾아 출력하는 방법을 다룹니다. 만약 중복된 요소가 하나도 없다면 -1을 반환합니다. 예를 들어 배열이 [12, 15, 12, 3, 6, 12, 3, 48, 56, 8, 48]과 같다면, 중복 요소는 [12, 3, 48]입니다.접근 방법이 문제는 C++의 unordered_map(해시 맵)을 활용하면 효율적으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.먼저 배열의 모든 요소를 순회하면서 각 값의 등장 횟수를 unord

  8. C++에서 배열 전체 곱이 커지도록 모든 요소에 할당할 최솟값 구하기

    문제 개요n개의 요소로 이루어진 배열이 있다고 가정해 보겠습니다. 배열의 모든 요소를 특정 값 x로 통일했을 때(arr[i] = x), 새 배열 전체의 곱이 원래 배열 전체의 곱보다 엄격하게 커지도록 만드는 최솟값 x를 구하는 것이 목표입니다.제약 조건은 다음과 같습니다.1 ≤ n ≤ 10^51 ≤ arr[i] ≤ 10^10예를 들어 배열이 [4, 2, 1, 10, 6]이라면 정답은 4입니다. 4 × 4 × 4 × 4 × 4 = 1024로, 원래 곱인 4 × 2 × 1 × 10 × 6 = 480보다 크기 때문입니다. 반면 3으로 채

  9. C++ O(1) 공간 복잡도로 0부터 N-1까지의 배열에서 중복 요소 찾기

    0부터 n-1까지의 숫자로 이루어진 배열이 있다고 가정해 봅시다. 이때 어떤 숫자는 여러 번 중복해서 나타날 수 있으며, 우리는 추가 메모리 공간을 전혀 사용하지 않고 이러한 중복된 숫자들을 찾아야 합니다.예를 들어 n = 7이고 배열이 [5, 2, 3, 5, 1, 6, 2, 3, 4, 5]와 같다면, 중복된 값은 5, 2, 3입니다.알고리즘 접근 방식이 문제는 배열 원소의 부호(sign)를 활용하는 영리한 기법으로 해결할 수 있습니다. 모든 값이 0부터 n-1 범위 안에 존재하므로 각 값 자체가 유효한 인덱스 역할을 하며, 해당

  10. C++에서 섞인 배열에서 누락된 숫자 찾기 – XOR 트릭 완벽 가이드

    두 개의 배열 A와 B가 있다고 가정해 보겠습니다. 배열 A는 n개의 요소를 가지고 있으며, 두 번째 배열 B는 A의 모든 요소를 포함하지만 순서가 섞여(shuffled) 있고 그중 하나의 요소가 제거되어 있습니다. 우리의 목표는 이 누락된 요소를 찾아내는 것입니다.예를 들어 A = [4, 8, 1, 3, 7]이고 B = [7, 4, 3, 1]이라면, B에는 없는 요소인 8이 출력되어야 합니다.XOR 연산을 활용한 해결 원리이 문제는 XOR(배타적 논리합) 트릭을 사용하면 매우 효율적으로 해결할 수 있습니다. 핵심 아이디어는 다음과

  11. C++로 두 원소의 차이가 k로 나누어떨어지는 m개 원소 집합 찾기

    문제 개요N개의 양의 정수로 이루어진 배열과 변수 K가 주어져 있다고 가정해 보겠습니다. 이때 임의의 두 원소의 차이가 k로 나누어떨어지는 정확히 m개의 원소로 구성된 집합을 찾아야 합니다.예를 들어 배열이 A = [4, 7, 10, 6, 9]이고 k = 3, m = 3이라면 출력은 yes입니다. 4, 7, 10처럼 서로 간의 차이(3, 3, 6)가 모두 3으로 나누어떨어지는 세 원소를 찾을 수 있기 때문입니다.접근 방법: 나머지(Remainder) 활용이 문제를 효율적으로 해결하려면 각 원소를 k로 나눈 나머지를 추적해야 합니다.

  12. C++로 2D 평면에서 점에서 직선까지의 수선의 발 구하기

    2차원 평면 위의 한 점 P와 직선의 방정식이 주어졌을 때, 점 P에서 그 직선으로 내린 수선의 발(foot of perpendicular)의 좌표를 구하는 것이 이 글의 목표입니다. 기하학적 개념을 간단한 대수 공식으로 바꾸면 코드 몇 줄만으로도 손쉽게 해를 구할 수 있습니다. 수학적 접근 방법 주어진 직선의 방정식은 다음과 같습니다. ax + by + c = 0 점 P(x1, y1)를 지나면서 위 직선에 수직인 직선은 다음 형태의 방정식을 갖습니다. ay − bx + d = 0 이 수직선이 원래의 직선과 만나는 점을 Q(x2

  13. C++로 이진 문자열을 n회 변환한 뒤 i번째 문자 찾기

    이진 문자열 bin이 주어졌을 때, 여기에 n번의 반복(변환)을 적용한다고 가정해 보겠습니다. 각 반복 단계에서 0은 01로, 1은 10으로 변환됩니다. 우리의 목표는 n번 반복을 모두 거친 최종 문자열에서 i번째 인덱스의 문자를 찾아내는 것입니다.예를 들어 이진 문자열이 101이고 n = 2, i = 3이라고 가정해 보겠습니다. 첫 번째 반복 후에는 100110이 되고, 두 번째 반복 후에는 100101101001이 됩니다. 따라서 인덱스 3에 해당하는 문자는 1입니다.문제 해결 접근 방법이 문제는 다음 단계에 따라 해결할 수 있

  14. C++에서 n XOR (n+1) = k가 되도록 하는 수 n 찾기

    문제 개요양수 k가 주어졌을 때, n과 n+1의 XOR 연산 결과가 k와 정확히 일치하는 양수 n을 찾는 것이 목표입니다.예를 들어 k = 7(이진수 111)이라면, 정답은 3입니다. 3은 이진수로 011이고, 3 + 1 = 4는 이진수로 100이므로 다음과 같이 계산됩니다.011 XOR 100 = 111 (십진수 7)해결 접근 방법이 문제는 두 가지 경우로 나누어 분석할 수 있습니다.경우 1: n이 짝수일 때짝수 n의 마지막 비트는 0이고, n+1의 마지막 비트는 1입니다. 나머지 상위 비트들은 모두 동일하므로, XOR 연산 결과

  15. C++에서 주어진 여는 괄호에 대응하는 닫는 괄호의 인덱스 찾기

    괄호가 포함된 표현식이 있을 때, 특정 여는 괄호의 인덱스가 주어지면 그 괄호에 대응하는 닫는 괄호의 위치를 찾아야 하는 경우가 있습니다. 예를 들어 표현식이 (25*6+(88-32+(50/10)+20))이고 여는 괄호의 인덱스가 6이라면, 그에 대응하는 닫는 괄호는 인덱스 23에 위치합니다.해결 접근 방법: 스택 활용이 문제는 스택(Stack) 자료구조를 사용하면 효율적으로 해결할 수 있습니다. 알고리즘의 동작 과정은 다음과 같습니다.주어진 인덱스부터 표현식을 순회하며 시작합니다.여는 괄호 (를 만나면 스택에 push 합니다.닫는

  16. C++에서 짝수 인덱스 이항 계수의 합 구하기

    숫자 n이 주어졌을 때, 짝수 인덱스에 위치한 이항 계수들의 합을 구하는 문제를 살펴보겠습니다. 즉, 다음과 같은 형태의 값을 계산해야 합니다.$$\left(\begin{array}{c}n\\ 0\end{array}\right)+\left(\begin{array}{c}n\\ 2\end{array}\right)+\left(\begin{array}{c}n\\ 4\end{array}\right)+\left(\begin{array}{c}n\\ 6\end{array}\right)+...$$예를 들어 n = 4인 경우는 다음과 같습니다.$$\

  17. C++에서 반복적인 반전 및 추가 연산으로 생성된 이진 문자열의 k번째 비트 찾기

    초기값이 0인 이진 문자열이 있다고 가정해 보겠습니다. 매 반복(iteration)마다 현재 문자열을 반전시킨 후(0은 1로, 1은 0으로 변경), 그 결과를 기존 문자열 뒤에 덧붙입니다. 이 과정을 n번 수행한 뒤, 완성된 문자열에서 k번째 비트를 찾는 것이 이 문제의 목표입니다.예를 들어 반복 횟수가 4이고 k = 7이라면, 문자열은 아래 표와 같이 변화합니다.반복 횟수문자열 값 (초기값: 0)1012011030110100140110100110010110따라서 7번째 비트는 1입니다.접근 방법핵심 아이디어는 간단합니다. 각 반복

  18. C++ 배열에서 중복되지 않는(고유한) 요소의 합 구하기

    배열 A에 여러 개의 요소가 저장되어 있다고 가정해 보겠습니다. 우리가 구해야 할 것은 배열에 존재하는 모든 고유한(distinct) 요소들의 합입니다. 예를 들어 A = [5, 12, 63, 5, 33, 47, 12, 63]이라면, 고유한 요소들의 합은 160이 됩니다. 중복된 값은 한 번이라도 계산에 포함되었다면 이후에는 완전히 무시됩니다.접근 방법: unordered_set 활용이 문제는 unordered_set(정렬되지 않은 집합)을 사용하면 매우 효율적으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.배열을 단 한

  19. C++로 1/n의 순환소수 마침표 길이 구하기

    어떤 자연수 n이 주어졌을 때, 1/n을 소수로 전개했을 때 반복되는 숫자 열(순환 마디)의 길이를 구하는 것이 이 문제의 목표입니다. 예를 들어 n = 7이라면 1/7 = 0.142857142857… 이 되며, 굵게 표시된 부분이 무한히 반복됩니다. 따라서 이 경우 마침표의 길이는 6입니다.접근 방법n으로 나누는 과정에서 나올 수 있는 서로 다른 나머지는 최대 n가지입니다. 하지만 순환이 반드시 첫 번째 나머지부터 시작하는 것은 아니며, 초반의 일부 나머지는 반복되지 않는 비순환 구간에 속할 수 있습니다.따라서 순환 구간에 속한

  20. C++ 반복 뺄셈으로 배열의 모든 요소를 동일하게 만든 뒤 최대 합 구하기

    문제 개요크기가 n인 배열이 주어졌을 때, 배열의 모든 요소를 동일한 값으로 만든 후 얻을 수 있는 최대 합을 구하는 것이 목표입니다. 단, 허용되는 연산은 하나뿐입니다. 임의의 두 요소를 선택하고, 그중 더 큰 값을 두 수의 절대 차(차이)로 대체하는 것입니다.예를 들어 배열이 [9, 12, 3, 6]이라면 결과는 12가 됩니다. 과정을 단계별로 살펴보겠습니다.A[1]을 A[1] – A[3] = 12 – 6 = 6으로 교체 → [9, 6, 3, 6]A[3]을 A[3] – A[2] = 6 &

Total 5981 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:101/300  20-컴퓨터/Page Goto:1 95 96 97 98 99 100 101 102 103 104 105 106 107