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

C++

  1. C++로 두 개의 이진 트리를 하나로 병합하는 프로그램

    문제 개요두 개의 이진 트리가 주어졌다고 가정해 봅시다. 한 트리를 다른 트리 위에 겹쳐 놓으면 일부 노드는 서로 겹치고, 나머지 노드는 겹치지 않습니다. 이때 두 트리를 새로운 이진 트리 하나로 병합해야 합니다.병합 규칙은 다음과 같습니다.두 노드가 겹치는 경우: 두 노드의 값을 더한 값이 병합된 노드의 새로운 값이 됩니다.한쪽 노드만 존재하는 경우: 값이 있는(비어 있지 않은) 노드가 그대로 새 트리의 노드로 사용됩니다.예를 들어 입력 트리가 다음과 같다면,트리 1: 1 트리 2: 2

  2. C++로 합이 n이 되는 완전제곱수의 최소 개수 구하기

    양의 정수 n이 주어졌을 때, 그 합이 정확히 n이 되도록 하는 완전제곱수(perfect square)의 최소 개수를 구하는 문제입니다. 예를 들어 n이 10이라면, 10 = 9 + 1처럼 두 개의 완전제곱수로 표현할 수 있으므로 출력은 2가 됩니다.이 문제는 동적 프로그래밍(Dynamic Programming)을 활용하면 효율적으로 해결할 수 있습니다. 해결 절차는 다음과 같습니다.길이가 n + 1인 DP 테이블을 생성하고, 모든 값을 무한대(INF)로 초기화합니다.dp[0] := 0 으로 설정합니다. (합이 0이 되는 데 필요한

  3. C++로 후위 표기법(Postfix Notation) 수식 평가하기

    후위 표기법(Postfix Notation)으로 작성된 수식이 주어졌을 때, 그 값을 계산하는 프로그램을 만들어 보겠습니다. 후위 표기법은 역폴란드 표기법(Reverse Polish Notation)이라고도 불리며, 연산자가 피연산자 뒤에 위치하는 것이 특징입니다. 이러한 수식은 스택(Stack) 자료구조를 활용하면 효율적으로 계산할 수 있습니다.예를 들어 수식이 21+3*라고 주어지면, 계산 결과는 9가 됩니다. ((2+1)×3 = 9)평가 알고리즘 단계후위 표기식의 각 문자 ch에 대해 다음을 반복 수행합니다.ch가 연산자(⊙)

  4. C++로 겹치는 구간 정리하기: 제거해야 할 최소 간격 수 구하는 프로그램

    여러 개의 구간(interval)이 주어졌을 때, 남은 구간들이 서로 겹치지 않도록 만들기 위해 최소 몇 개의 구간을 제거해야 하는지 구하는 문제입니다. 예를 들어 구간이 [[8,10],[3,5],[6,9]]라면, [6,9] 하나만 제거하면 나머지 구간이 모두 겹치지 않으므로 정답은 1이 됩니다.문제 해결 접근 방식이 문제는 그리디(Greedy) 알고리즘으로 효율적으로 해결할 수 있습니다. 핵심 아이디어는 끝나는 시간이 빠른 구간부터 선택하는 것입니다. 구간이 일찍 끝날수록 뒤에 오는 구간과 겹칠 가능성이 줄어들어, 더 많은 구간을

  5. C++에서 부분 리스트를 제거해 k보다 작은 수와 큰 수의 개수를 같게 만드는 프로그램

    숫자 리스트 nums와 정수 k가 주어졌다고 가정해 봅시다. 우리는 리스트에서 임의의 연속된 부분 리스트(sublist)를 최대 한 번 제거할 수 있으며, 그 결과 k보다 작은 숫자의 개수와 k보다 큰 숫자의 개수가 서로 같아지는 리스트 중 가장 길이가 긴 것의 길이를 구해야 합니다.예를 들어, 입력이 nums = [6, 10, 8, 9, 3, 5], k = 6이라면 출력은 5입니다. 부분 리스트 [9]를 제거하면 [6, 10, 8, 3, 5]라는 리스트를 얻을 수 있는데, 이 리스트에는 6보다 작은 수가 [3, 5]로 두 개, 6

  6. C++로 푸는 막대 자르기 문제: 최대 판매 이익을 구하는 동적 계획법 프로그램

    막대 자르기(Rod Cutting) 문제란?길이가 n인 하나의 막대가 주어져 있다고 가정해 보겠습니다. 그리고 막대의 각 길이별 가격이 담긴 목록도 함께 주어집니다. 우리가 해야 할 일은 이 막대를 여러 조각으로 잘라 시장에 팔았을 때 얻을 수 있는 최대 이익을 구하는 것입니다.최적의 결과를 얻으려면 막대를 여러 위치에서 잘라보면서, 잘라낸 조각들의 가격 합을 서로 비교해야 합니다.예를 들어, 가격 목록이 prices = [1, 5, 8, 9, 10, 17, 17, 20]이고 막대 길이 n = 8이라고 합시다. 이때 막대를 길이 2

  7. C++에서 연결 리스트를 k칸만큼 오른쪽으로 회전하는 프로그램

    연결 리스트가 하나 주어져 있다고 가정해 봅시다. 이 리스트를 오른쪽으로 k칸 회전시켜야 하며, k의 값은 항상 양수입니다. 예를 들어 리스트가 [1 -> 2 -> 3 -> 4 -> 5 -> NULL]이고 k = 2라면, 출력 결과는 [4 -> 5 -> 1 -> 2 -> 3 -> NULL]이 됩니다.알고리즘 접근 방식이 문제를 효율적으로 해결하는 핵심 아이디어는 리스트를 임시로 원형 연결 리스트로 만드는 것입니다. 마지막 노드가 첫 번째 노드를 가리키게 한 뒤, 적절한 위치에서

  8. C++에서 문자 배열로 저장된 문장의 단어 순서 반전하기

    각 요소가 하나의 문자로 저장된 입력 문장이 주어졌을 때, 이 문장을 단어 단위로 반전시켜야 하는 상황을 생각해 보겠습니다.예를 들어 입력이 [t,h,e, ,m,a,n, ,i,s, ,n,i,c,e], 즉 the man is nice라면, 출력은 [n,i,c,e, ,i,s, ,m,a,n, ,t,h,e], 즉 nice is man the가 되어야 합니다.해결 알고리즘이 문제는 다음 단계를 통해 해결할 수 있습니다.배열 s 전체를 반전시킵니다.j := 0으로 초기화합니다.n := 배열 s의 크기로 설정합니다.i를 0부터 n 미만까지 1씩

  9. C++에서 문자열 형태의 두 숫자를 곱하고 결과를 문자열로 반환하는 방법

    두 개의 숫자가 문자열 형태로 주어졌다고 가정해 봅시다. 이 두 수를 곱한 뒤, 그 결과 역시 문자열 형태로 반환해야 합니다. 예를 들어 28과 25가 입력으로 주어지면 결과는 700이 됩니다. 이 문제가 중요한 이유는 숫자가 매우 커서 int나 long long 같은 기본 정수 자료형의 표현 범위를 초과하는 경우에도 정확한 곱셈 결과를 얻을 수 있기 때문입니다. 초대형 정수(bignum) 연산을 직접 구현할 때 활용되는 대표적인 기법입니다. 알고리즘 접근 방법 핵심 아이디어는 손으로 곱셈을 계산하는 과정을 그대로 코드로 옮기는

  10. C++에서 한 문자열이 다른 문자열의 부분 수열인지 확인하는 프로그램

    두 개의 문자열 S와 T가 주어졌을 때, S가 T의 부분 수열(subsequence)인지 판별해야 합니다. 부분 수열이란 원본 문자열에서 문자들을 순서를 유지한 채 일부를 선택해 만든 문자열을 의미하며, 선택된 문자들이 반드시 연속될 필요는 없습니다.예를 들어 S = abc, T = adbrcyxd라고 가정해 보겠습니다. T 안에서 a → b → c 순서로 문자가 등장하므로 결과는 True가 됩니다.접근 방법이 문제는 투 포인터(two pointer) 기법으로 선형 시간에 효율적으로 해결할 수 있습니다. 핵심 아이디어는 긴 문자열을

  11. C++ 백트래킹으로 스도쿠 퍼즐 자동 해결하기 — 완전 정복 가이드

    스도쿠란 무엇인가?스도쿠는 9×9 크기의 숫자 퍼즐로, 전체 격자는 다시 3×3 크기의 작은 상자(박스) 9개로 나뉩니다. 부분적으로 채워진 스도쿠 그리드가 주어졌을 때 이를 해결하려면 다음 두 가지 기본 규칙을 반드시 지켜야 합니다.숫자는 반드시 1부터 9까지의 숫자만 사용해야 합니다.같은 숫자는 하나의 행, 하나의 열, 그리고 하나의 3×3 박스 안에서 중복될 수 없습니다.백트래킹(Backtracking) 접근 방식이 문제는 백트래킹 알고리즘을 사용하면 효과적으로 해결할 수 있습니다. 백트래킹의 핵심 아이디어는 다음과 같습니다.

  12. C++로 이진 트리의 오른쪽 잎 노드 합 구하기

    문제 개요 이진 트리가 하나 주어졌을 때, 트리에 있는 모든 오른쪽 잎(right leaf) 노드 값의 합을 구하는 문제입니다. 여기서 오른쪽 잎이란 부모 노드의 오른쪽 자식이면서 동시에 자기 자신은 자식이 없는 노드를 의미합니다. 예를 들어 아래와 같은 이진 트리가 입력으로 주어진다고 가정해 보겠습니다. 이때 출력은 17입니다. 이 트리에는 값이 각각 7과 10인 두 개의 오른쪽 잎 노드가 존재하고, 7 + 10 = 17이 되기 때문입니다. 풀이 접근 방법 이 문제는 DFS(깊이 우선 탐색)를 활용하면 깔끔하게 해결할 수 있습니

  13. C++로 이진 트리의 가장 깊은 리프 노드 값의 합 구하기

    이진 트리가 주어졌을 때, 가장 깊은 곳에 위치한 리프(잎) 노드들의 값을 모두 더한 합계를 구하는 문제를 살펴보겠습니다.예를 들어 다음과 같은 이진 트리가 있다고 가정해 보겠습니다.이 트리에서 가장 깊은 리프 노드들은 레벨 3에 있는 7과 4입니다. 따라서 이 두 노드의 값을 더한 결과인 11이 출력됩니다.문제 해결 접근 방법이 문제는 재귀적으로 트리를 순회하면서 각 레벨별 노드 값의 합을 기록하는 방식으로 해결할 수 있습니다. 알고리즘의 동작 과정은 다음과 같습니다.레벨별 합계를 저장할 맵(map) m과 최대 깊이를 나타내는 변

  14. C++로 열 번호를 스프레드시트 열 제목으로 변환하는 프로그램

    문제 소개양의 정수가 하나 주어졌을 때, 이 숫자에 해당하는 스프레드시트(엑셀)의 열 제목을 찾아야 합니다. 스프레드시트에서 열은 다음과 같이 표기됩니다.1 → A2 → B26 → Z27 → AA28 → AB예를 들어 입력값이 29라면 출력은 AC가 됩니다.해결 알고리즘이 문제는 일반적인 26진법 변환과 비슷해 보이지만, 스프레드시트 열 번호에는 0에 해당하는 자릿수가 없다는 점이 다릅니다. 따라서 각 자릿수를 계산하기 전에 n에서 1을 먼저 빼주어야 합니다. 전체 해결 과정은 다음과 같습니다.n이 0이 아닌 동안 아래 작업을 반복

  15. C++로 스프레드시트 열 번호를 알파벳 열 제목으로 변환하는 프로그램

    스프레드시트의 열 제목은 알파벳 문자로 구성됩니다. 첫 번째 열은 A로 시작하고, Z 다음에는 AA, AB가 이어지며, ZZ 이후에는 다시 AAA, AAB 순으로 진행됩니다. 즉, 1번 열은 A, 26번 열은 Z, 27번 열은 AA에 해당합니다.이 글에서는 열 번호가 주어졌을 때 이에 대응하는 열 제목(문자)을 구하는 방법을 C++ 코드로 살펴보겠습니다. 예를 들어 열 번호가 80이면 결과는 CB이고, 30이면 AD가 됩니다.변환 원리이 문제는 일반적인 26진법 변환과 비슷하지만 한 가지 중요한 차이가 있습니다. 스프레드시트 열 제

  16. C++ 이진 트리 가지치기: 1을 포함하지 않는 서브트리 제거하기

    문제 소개 모든 노드의 값이 0 또는 1로만 구성된 이진 트리(binary tree)가 있다고 가정해 봅시다. 이때 값이 1인 노드를 하나도 포함하지 않는 모든 서브트리(subtree)를 잘라내어(prune), 결과적으로 동일한 구조의 트리를 만드는 것이 목표입니다. 예를 들어 다음과 같은 트리가 주어졌다면, 트리 말단에 있는 0으로만 이루어진 가지들이 모두 잘려 나간 트리가 최종 결과가 됩니다. 해결 전략: 재귀와 후위 순회 이 문제는 재귀(Recursion)를 활용하면 매우 깔끔하게 해결할 수 있습니다. 핵심 아이디어는 후위

  17. C++로 배열에서 만들 수 있는 유효한 삼각형 조합의 개수 구하기

    숫자 배열이 주어졌을 때, 배열에서 세 개의 숫자를 골라 삼각형의 세 변의 길이로 사용할 수 있는 조합(트리플렛)의 개수를 구하는 문제입니다.예를 들어 입력이 [2,2,3,4]라면 결과는 3이 됩니다. 첫 번째 2를 사용한 [2,3,4], 두 번째 2를 사용한 [2,3,4], 그리고 [2,2,3]으로 총 세 가지 조합이 유효한 삼각형을 만들 수 있기 때문입니다.접근 방법삼각형이 성립하려면 가장 긴 변이 나머지 두 변의 합보다 작아야 한다는 삼각형 부등식을 활용합니다. 이를 효율적으로 확인하기 위해 다음 단계를 따릅니다.결과값 ret

  18. C++에서 곱이 주어진 값과 같은 삼중항 개수 세기

    길이가 n인 정수 배열 Arr[]와 목표값 M이 주어졌을 때, 배열에서 서로 다른 세 원소를 곱한 값이 M과 같아지는 조합(삼중항, triplet)의 개수를 구하는 것이 이 문제의 목표입니다. 배열에는 양의 정수만 포함되어 있다고 가정합니다.가장 직관적인 풀이 방법은 세 개의 for 루프를 중첩하여 가능한 모든 인덱스 조합(i < j < k)을 확인하는 것입니다. 각 조합에 대해 arr[i] * arr[j] * arr[k] == M을 만족하면 카운트를 1씩 증가시키고, 모든 탐색이 끝난 후 카운트 값을 반환하면 됩니다.예

  19. C++에서 소인수가 2와 3뿐인 숫자 개수 구하기

    두 개의 숫자 START와 END가 주어져 하나의 숫자 범위를 정의합니다. 우리의 목표는 [START, END] 범위 안에서 소인수가 오직 2와 3뿐인 숫자를 찾아 그 개수를 구하는 것입니다.이 문제는 START부터 END까지 숫자를 하나씩 순회하며 해결할 수 있습니다. 각 숫자에 대해 2 또는 3으로 나누어 떨어지는지 검사하고, 나누어 떨어지면 계속 나누어 값을 줄여갑니다. 어느 쪽으로도 나눌 수 없다면 반복문을 종료합니다. 최종적으로 값이 1로 줄어들었다면, 해당 숫자는 2와 3 외에 다른 소인수를 가지지 않는다는 뜻입니다.구체

  20. C++로 1부터 N 사이에서 0을 자릿수로 가지는 숫자 개수 구하기

    숫자 N이 주어졌을 때, 목표는 [1, N] 범위 내에서 자릿수 중 0을 하나라도 포함하는 숫자의 개수를 구하는 것입니다.이 문제는 숫자를 처음부터 끝까지 하나씩 검사하는 방식으로 해결할 수 있습니다. 한 자리 숫자(1~9)에는 0이 존재할 수 없으므로, 실질적으로는 10부터 N까지만 확인하면 됩니다. 각 숫자에 대해 while 루프를 사용해 모든 자릿수를 검사하고, 0인 자릿수를 발견하면 카운트를 증가시킨 뒤 다음 숫자로 넘어갑니다. 0이 아니라면 숫자를 10으로 나누어 다음 자릿수를 검사하고, 이 과정은 남은 숫자가 없을 때까지

Total 5981 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:220/300  20-컴퓨터/Page Goto:1 214 215 216 217 218 219 220 221 222 223 224 225 226