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

C++

  1. C++로 두 직사각형의 총 면적 구하기

    문제 소개 2차원 평면 위에 놓인 두 개의 직사각형(변이 축에 평행한 사각형)이 덮고 있는 총 면적을 구하는 문제입니다. 각 직사각형은 아래 그림과 같이 왼쪽 아래 꼭짓점과 오른쪽 위 꼭짓점의 좌표로 정의됩니다. 첫 번째 직사각형은 (A, B)~(C, D), 두 번째 직사각형은 (E, F)~(G, H)로 표현합니다. 주의할 점은 두 사각형이 겹치는 영역이 있을 경우 그 부분을 한 번만 계산해야 한다는 것입니다. 해결 접근 방법 이 문제의 핵심은 다음과 같습니다. 두 사각형이 겹치지 않는다면 두 면적을 단순히 더하면 됩니다. 겹친

  2. C++ 다수 요소 II: n/3보다 많이 등장하는 원소 찾기

    문제 개요정수 배열이 하나 주어졌을 때, n/3번(내림 값)보다 많이 등장하는 모든 원소를 찾아야 합니다. 여기서 n은 배열의 크기를 의미합니다.예를 들어 입력 배열이 [1,1,1,3,3,2,2,2]라고 가정해 보겠습니다. 배열의 크기 n은 8이므로 8/3 = 2, 즉 2번보다 많이 등장하는 원소를 찾으면 됩니다. 이 경우 1은 세 번, 2는 세 번 등장하므로 결과는 [1, 2]가 됩니다.접근 방법: 보이어-무어(Boyer-Moore) 다수결 투표 알고리즘n/3보다 많이 등장하는 원소는 최대 2개까지만 존재할 수 있습니다. 만약 후

  3. C++로 괄호를 넣을 수 있는 모든 경우의 계산 결과 구하기

    숫자와 연산자로 이루어진 문자열이 주어졌을 때, 숫자와 연산자를 다양한 방식으로 묶어서(즉, 괄호를 서로 다르게 배치해서) 얻을 수 있는 모든 가능한 결과값을 찾아야 합니다. 이 문제에서 사용할 수 있는 유효한 연산자는 + , - , * 세 가지입니다.예를 들어 입력이 2*3-4*5라고 한다면, 출력은 [-34, -14, -10, -10, 10]이 됩니다. 그 이유는 다음과 같습니다.(2*(3-(4*5))) = -34((2*3)-(4*5)) = -14((2*(3-4))*5) = -10(2*((3-4)*5)) = -10(((2*3)-

  4. C++로 푸는 단일 숫자 III(Single Number III): XOR 비트 연산으로 한 번만 나타나는 두 수 찾기

    배열이 하나 주어졌을 때, 정확히 두 개의 원소는 한 번만 나타나고 나머지 원소들은 모두 두 번씩 나타난다고 가정해 봅시다. 이때 이 두 숫자를 찾는 함수를 정의해야 합니다. 예를 들어 주어진 배열이 [1,2,3,1,5,2]라면 출력 결과는 [3, 5]가 됩니다.접근 방법이 문제는 XOR(배타적 OR) 비트 연산의 성질을 활용하면 O(n) 시간 복잡도와 O(1) 추가 공간으로 효율적으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.모든 원소를 XOR하면 두 번 나타나는 숫자들은 서로 상쇄되고, 결국 한 번만 나타나는 두 숫

  5. C++로 n번째 못생긴 수(Ugly Number) 구하기: 다이내믹 프로그래밍 완벽 가이드

    못생긴 수(Ugly Number)란 소인수가 오직 2, 3, 5뿐인 양의 정수를 의미합니다. 처음 몇 개의 못생긴 수는 1, 2, 3, 4, 5, 6, 8, 9, 10, 12이며, 이 순서에서 10번째 못생긴 수는 12입니다.이 문제는 n번째 못생긴 수를 효율적으로 찾는 것입니다. 모든 수를 하나씩 검사하는 브루트포스 방식은 매우 비효율적이지만, 다이내믹 프로그래밍(DP)과 세 개의 포인터를 활용하면 O(n) 시간 복잡도로 빠르게 해결할 수 있습니다.알고리즘 핵심 아이디어모든 못생긴 수는 이미 구한 더 작은 못생긴 수에 2, 3,

  6. C++로 H-지수(H-Index) 계산하기: 버킷 배열 활용 알고리즘

    연구자의 논문 인용 횟수 배열(모두 음이 아닌 정수)이 주어졌을 때, 해당 연구자의 H-지수(H-Index)를 계산하는 함수를 정의하는 문제입니다.H-지수의 정의는 다음과 같습니다. 어떤 과학자의 N편의 논문 중 h편의 논문이 각각 최소 h번 이상 인용되었고, 나머지 N − h편의 논문은 각각 h번 이하로 인용되었다면, 그 과학자의 지수는 h이다.예제 이해하기입력이 citations = [3, 0, 6, 1, 7]이라면 출력은 3입니다. 연구자는 총 5편의 논문을 발표했으며, 각 논문은 3, 0, 6, 1, 7번 인용되었습니다. 최

  7. C++로 풀어보는 H-인덱스 II: 이진 탐색으로 O(log n)에 해결하기

    한 연구자의 논문 인용 횟수 배열(모두 음이 아닌 정수)이 주어졌을 때, 이 배열은 오름차순(비내림차순)으로 정렬되어 있습니다. 우리는 이 연구자의 H-인덱스(h-index)를 계산하는 함수를 작성해야 합니다. H-인덱스의 정의는 다음과 같습니다. 어떤 과학자가 총 N편의 논문 중 h편의 논문이 각각 최소 h번 이상 인용되었고, 나머지 N − h편의 논문은 각각 h번 이하로 인용되었다면, 그 과학자의 인덱스는 h입니다. 예를 들어 입력이 citations = [0, 1, 4, 5, 6]이라면 출력은 3이 됩니다. 연구자가 5편의

  8. C++로 판별하는 덧셈 숫자(Additive Number) 문제 풀이

    문제 개요0부터 9까지의 숫자만으로 구성된 문자열이 주어졌을 때, 이 문자열이 덧셈 숫자(Additive Number)인지 판별하는 함수를 작성해야 합니다. 덧셈 숫자란 문자열의 자릿수들이 하나의 덧셈 수열을 이룰 수 있는 문자열을 의미합니다.유효한 덧셈 수열은 최소 세 개의 숫자를 포함해야 하며, 첫 두 숫자를 제외한 나머지 모든 숫자는 바로 앞에 있는 두 숫자의 합과 같아야 합니다. 예를 들어 입력이 112358이라면 결과는 true입니다. 1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8처럼 수열이

  9. C++ 비트마스크로 푸는 공통 문자 없는 단어 길이 최대 곱 문제

    문제 개요문자열 배열 words가 주어졌을 때, 서로 공통된 문자를 갖지 않는 두 단어 word[i]와 word[j]에 대해 length(word[i]) × length(word[j]) 값의 최댓값을 구하는 것이 목표입니다. 모든 단어는 영어 소문자로만 이루어져 있다고 가정하며, 조건을 만족하는 두 단어가 존재하지 않으면 0을 반환합니다.예를 들어 입력이 [abcw, baz, foo, bar, xtfn, abcdef]라면 출력은 16입니다. 그 이유는 abcw와 xtfn이 공통 문자를 하나도 공유하지 않으면서 각각 길이가 4이므로,

  10. C++로 항공권 여정 재구성하기: DFS와 오일러 경로 완벽 정리

    출발 공항과 도착 공항의 쌍 [from, to] 형태로 표현된 항공권 목록이 주어졌다고 가정해 봅시다. 우리는 이 항공권들을 모두 사용해 여정을 올바른 순서대로 재구성해야 합니다. 모든 항공권은 JFK에서 출발하는 한 사람의 소유이므로, 완성된 여정은 반드시 JFK에서 시작해야 합니다.예를 들어 입력이 [[MUC, LHR], [JFK, MUC], [SFO, SJC], [LHR, SFO]]라면, 출력은 [JFK, MUC, LHR, SFO, SJC]가 됩니다.문제 해결 접근 방법이 문제는 본질적으로 오일러 경로(Eulerian Path

  11. C++로 풀어보는 정수 나누기(Integer Break) 문제 – 최대 곱 구하기

    문제 소개양의 정수 n이 주어졌을 때, 이를 최소 두 개 이상의 양의 정수의 합으로 분할하고, 그 수들의 곱이 최대가 되도록 만드는 문제입니다.예를 들어 n = 10이라면, 10 = 3 + 3 + 4로 나눌 때 곱이 3 × 3 × 4 = 36으로 가장 크므로 정답은 36이 됩니다.접근 방법 (동적 계획법)이 문제는 메모이제이션(memoization)을 활용한 동적 계획법(DP)으로 효율적으로 해결할 수 있습니다. 해결 과정은 다음과 같습니다.solve(n, dp, flag) 메서드를 정의합니다.n이 0이면 1을 반환합니다. (분할이

  12. C++로 자릿수가 모두 다른 숫자 개수 세기

    음이 아닌 정수 n이 주어졌을 때, 0부터 10^n 범위 안에서 모든 자릿수가 서로 다른(중복되지 않는) 숫자 x의 개수를 구하는 문제입니다.예를 들어 n이 2라면, 구해야 할 범위는 0부터 100까지입니다. 이때 11, 22, 33, 44, 55, 66, 77, 88, 99처럼 같은 숫자가 반복되는 수는 제외해야 하므로, 결과값은 91이 됩니다.문제 해결 접근 방법이 문제는 수학적 규칙을 활용하면 효율적으로 풀 수 있습니다. 각 단계는 다음과 같습니다.n이 0이면, 표현할 수 있는 숫자는 0 하나뿐이므로 1을 반환합니다.n의 값이

  13. C++로 풀어보는 물과 주전자 문제 – 두 개의 물통으로 정확한 용량 측정하기

    문제 소개용량이 각각 x리터와 y리터인 두 개의 물통이 있다고 가정해 보겠습니다. 우리는 무한한 양의 물을 사용할 수 있으며, 이 두 물통만으로 정확히 z리터의 물을 측정할 수 있는지 판단해야 합니다.측정이 가능하려면, 작업이 끝난 시점에 한쪽 또는 양쪽 물통에 담긴 물의 총량이 정확히 z리터가 되어야 합니다.허용되는 연산이 문제에서 수행할 수 있는 연산은 다음 세 가지뿐입니다.아무 물통이든 가득 찰 때까지 물을 채운다.아무 물통이든 완전히 비운다.한 물통에서 다른 물통으로 물을 붓는데, 받는 쪽 물통이 가득 차거나 붓는 쪽 물통이

  14. C++로 구현하는 가장 큰 나눌 수 있는 부분 집합(Largest Divisible Subset)

    서로 다른 양의 정수로 이루어진 집합이 주어졌을 때, 해당 집합 내 모든 원소 쌍 (Si, Sj)이 Si % Sj == 0 또는 Sj % Si == 0 조건을 만족하도록 하는 가장 큰 부분 집합을 찾는 문제입니다.예를 들어 입력이 [1, 2, 3]이라면 가능한 답은 [1, 2] 또는 [1, 3]이 될 수 있습니다. 2와 3은 서로 나누어 떨어지지 않으므로 두 숫자를 동시에 포함할 수 없기 때문입니다.문제 해결 접근 방식이 문제는 최장 증가 부분 수열(LIS) 알고리즘과 유사한 방식으로 동적 계획법(DP)을 적용해 해결할 수 있습니다

  15. C++로 풀어보는 Super Pow 문제: 배열로 주어진 초대형 지수의 거듭제곱 나머지 구하기

    문제 개요양의 정수 a와 매우 큰 양의 정수 b가 배열 형태로 주어졌을 때, a^b mod 1337의 값을 계산하는 것이 목표입니다. 예를 들어 a = 2이고 b = [1,0](즉, 숫자 10)이라면 결과는 1024입니다.b가 일반적인 정수 자료형의 범위를 훨씬 넘어설 수 있기 때문에, 지수를 한 번에 다루는 대신 자릿수 단위로 분할하여 처리하는 전략이 필요합니다.풀이 접근 방법핵심 아이디어는 두 가지입니다.빠른 거듭제곱(모듈러 지수 연산): 반복 곱셈 대신 제곱으로 분할하여 O(log n) 시간 안에 거듭제곱을 계산합니다.재귀적

  16. C++로 해결하는 흔들리는 부분 수열(Wiggle Subsequence) 문제

    흔들리는 수열(Wiggle Sequence)이란?연속된 숫자 사이의 차이가 양수와 음수를 엄격하게 번갈아 나타내는 수열을 흔들리는 수열(Wiggle Sequence)이라고 합니다. 이때 첫 번째 차이는 양수 또는 음수 어느 쪽이든 상관없습니다. 또한 원소가 두 개 미만인 수열은 자명하게 흔들리는 수열로 간주됩니다.예를 들어 [1,7,4,9,2,5]는 인접한 숫자 간의 차이가 (6,-3,5,-7,3)으로 양수와 음수가 번갈아 나타나므로 흔들리는 수열입니다. 반면 [1,4,7,2,5]는 처음 두 차이가 모두 양수이고, [1,7,4,5,

  17. C++ 연결 리스트 랜덤 노드: 저수지 샘플링으로 균등 확률 구현하기

    문제 개요 단일 연결 리스트(singly linked list)가 주어졌을 때, 리스트 안에서 임의의 노드 하나의 값을 반환하는 문제입니다. 여기서 중요한 조건은 모든 노드가 동일한 확률로 선택되어야 한다는 점입니다. 예를 들어 리스트가 [1, 2, 3]이라면 반환되는 값은 반드시 1, 2, 3 중 하나여야 하며, 각 값이 선택될 확률은 정확히 1/3이 되어야 합니다. 접근 방법: 저수지 샘플링(Reservoir Sampling) 리스트의 전체 길이를 미리 알 수 없거나 한 번의 순회만 허용되는 상황에서 균등한 확률을 보장하려면

  18. C++로 풀어보는 제거 게임(Elimination Game): 마지막에 남는 숫자 구하기

    문제 설명1부터 n까지의 정수가 오름차순으로 정렬된 리스트가 있다고 가정해 봅시다. 이 게임의 규칙은 다음과 같습니다.먼저 왼쪽에서 오른쪽으로 진행하며, 첫 번째 숫자부터 시작해 하나 걸러 하나씩 숫자를 제거합니다. 즉, 리스트 끝에 도달할 때까지 첫 번째, 세 번째, 다섯 번째… 숫자를 차례로 지웁니다.그다음에는 오른쪽에서 왼쪽으로 방향을 바꿔, 남은 숫자들 중 맨 오른쪽 숫자부터 하나 걸러 하나씩 다시 제거합니다.이 과정을 방향을 계속 번갈아 가며 반복하여, 마지막에 단 하나의 숫자만 남을 때까지 진행합니다.길이가 n인 리스트로

  19. C++로 구현하는 UTF-8 인코딩 유효성 검사 완벽 가이드

    UTF-8 유효성 검사 문제란?정수 리스트가 주어졌을 때, 해당 데이터가 유효한 UTF-8 인코딩인지 판별하는 문제입니다. 하나의 UTF-8 문자는 1바이트에서 4바이트 길이까지 가질 수 있으며, 각 문자는 다음과 같은 규칙을 따릅니다.1바이트 문자: 첫 번째 비트는 0이며, 나머지 비트에 유니코드 코드 포인트가 저장됩니다.n바이트 문자(n ≥ 2): 첫 n개 비트는 모두 1이고, n+1번째 비트는 0입니다. 이어지는 n-1개의 바이트는 모두 최상위 2비트가 10으로 시작해야 합니다.UTF-8 인코딩 규칙 정리유니코드 문자의 값 범

  20. C++로 배우는 회전 함수(Rotate Function) 문제 풀이: O(n)으로 최댓값 구하기

    문제 개요 정수 배열 A와 그 길이 n이 주어진 상황을 가정해 보겠습니다. 배열 A를 시계 방향으로 k칸 회전한 결과를 배열 B(k)라고 할 때, 회전 함수는 다음과 같이 정의됩니다. F(k) = 0 × B(k)[0] + 1 × B(k)[1] + ... + (n-1) × B(k)[n-1] 목표는 F(0)부터 F(n-1)까지 모든 값 중에서 최댓값을 찾는 것입니다. 예제로 살펴보기 입력이 A = [4, 3, 2, 6]인 경우, 각 회전 단계별로 함수 값을 계산하면 다음과 같습니다. F(0) = (0×4) + (1×3) + (2×2

Total 5981 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:166/300  20-컴퓨터/Page Goto:1 160 161 162 163 164 165 166 167 168 169 170 171 172