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

C++

  1. C++ 반복문 없이 재귀로 숫자 패턴 출력하기

    문제 개요이 문제에서는 하나의 정수 n이 주어지며, n부터 시작해 값이 0 또는 음수에 도달할 때까지 감소한 뒤, 다시 원래의 n까지 증가하는 수열 패턴을 출력하는 것이 목표입니다.예를 들어 문제를 이해해 보겠습니다.입력: n = 12출력: 12 7 2 -3 2 7 12접근 방법for나 while 같은 반복문을 사용하지 않고 재귀(recursion)를 활용해 이 문제를 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.현재 값이 양수(m > 0)인 동안에는 값을 출력하고, 5를 뺀 값으로 재귀 호출을 이어갑니다.재귀 호출이

  2. C++로 구현하는 'n보다 작은 수 중 모든 자릿수가 서로 다른 가장 큰 수' 찾기

    문제 개요이 문제에서는 하나의 숫자 n이 주어지며, 우리의 목표는 n보다 작으면서 모든 자릿수가 중복 없이 서로 다른 숫자를 만족하는 가장 큰 수를 찾아 출력하는 것입니다.예시를 통해 문제를 이해해 보겠습니다.입력: n = 2332출력: 2319위 예시에서 2332보다 작은 수 중 자릿수가 모두 다른 가장 큰 수는 2319입니다. (2321은 2가 두 번 나타나므로 조건을 만족하지 않습니다.)접근 방법이 문제를 해결하는 가장 직관적인 방법은 n부터 0까지 역순으로 숫자를 검사하는 것입니다. 각 숫자에 대해 다음 과정을 수행합니다.현

  3. C++로 디지털 루트가 D인 K자리 숫자 출력하기

    문제 개요이 문제에서는 두 개의 값 K와 D가 주어집니다. 우리의 과제는 K자리 숫자를 출력하되, 그 숫자의 디지털 루트(digital root)가 정확히 D가 되도록 만드는 것입니다.디지털 루트란 숫자의 각 자릿수를 계속해서 더해 나가, 마침내 한 자리 숫자가 될 때까지 반복했을 때 얻어지는 최종 값을 의미합니다. 디지털 합(digital sum)이라고도 불립니다.예시를 통해 문제를 살펴보겠습니다.입력: D = 5, K = 6 출력: 500000즉, 6자리 숫자이면서 각 자릿수의 합을 반복적으로 더했을 때 5가 되는 수를 찾으면

  4. C++로 행렬을 역파형(Reverse Wave Form)으로 출력하는 방법

    이 문제에서는 하나의 행렬이 주어지며, 우리의 과제는 이 행렬을 역파형(reverse waveform) 형태로 한 줄에 출력하는 것입니다.예시를 통해 문제를 더 명확하게 이해해 보겠습니다.입력: 1 4 6 11 2 5 8 54 7 9 3 43 1 7 4 34출력: 11 54 43 34 4 3 8 6 4 5 9 7 1 7 2 1문제 해결 접근 방법이 문제를 해결하려면 행렬의 역파형을 출력해야 합니다. 그 방법은 다음과 같습니다.먼저 마지막 열의 요소들을 위에서 아래 방향(내림차순)으로 출력합니다.그다음 뒤에서 두

  5. C++로 지그재그 패턴 행렬 출력하기 — 왼쪽→오른쪽, 오른쪽→왼쪽 방향 교차

    이 문제에서는 2차원 배열(행렬)이 주어지며, 모든 요소를 특정 규칙에 따라 순서대로 출력해야 합니다. 규칙은 다음과 같습니다. 첫 번째 행은 왼쪽에서 오른쪽으로, 두 번째 행은 오른쪽에서 왼쪽으로, 세 번째 행은 다시 왼쪽에서 오른쪽으로 출력하는 식으로 행마다 방향을 번갈아 가며 진행합니다.문제 예시예제를 통해 문제를 더 쉽게 이해해 보겠습니다.입력: array = { {2, 5} {4, 9} } 출력: 2 5 9 4위 예시를 보면, 첫 번째 행의 {2, 5}는 왼쪽에서 오른쪽으로 그대로 출력되고, 두 번째 행의 {

  6. C++에서 한 점부터 시작해 나선형으로 행렬 출력하기

    문제 개요이 문제에서는 하나의 2차원 행렬과 한 점 P(c, r)가 주어집니다. 목표는 주어진 점 P에서 출발하여 행렬의 모든 요소를 반시계 방향으로 나선형(spiral)으로 탐색하며 출력하는 것입니다.예제예시를 통해 문제를 더 쉽게 이해해 보겠습니다.입력: matrix[][] = {{1, 4, 7}, {2, 5, 8}, {3, 6, 9}} 시작점 P = (0행, 2열) 출력: 7 8 5 4 9 6 3 2 1위 예제에서 시작점은 값 7이 있는 위치입니다. 이 지점에서 출발해 왼쪽

  7. C++로 2차원 행렬을 지그재그(ZigZag) 형태로 출력하기

    이 문제에서는 2차원 행렬이 주어지며, 우리가 해야 할 일은 이 행렬의 요소들을 지그재그(ZigZag) 형태로 출력하는 것입니다.예시를 통해 문제를 살펴보겠습니다.입력:   12 99 43   10 82 50   15 75 5출력: 12 99 43 50 82 10 15 75 5문제 해결 접근 방법이 문제를 해결하는 핵심 아이디어는 다음과 같습니다.짝수 번째 행(0, 2, 4...): 왼쪽에서 오른쪽(LtoR) 방향으로 요소를 출력합니다.홀수 번째 행(1

  8. C++에서 행렬을 역 나선 형태로 출력하는 방법

    이 문제에서는 2차원 행렬이 주어지며, 우리의 목표는 행렬의 모든 요소를 역 나선(reverse spiral) 형태로 출력하는 것입니다.문제 이해하기먼저 예시를 통해 문제를 살펴보겠습니다.입력:    12 23 54 67    76 90 01 51    43 18 49 5    31 91 75 9출력: 18 49 1 90 76 43 31 91 75 9 5 51 67 54 23 12출력 결과를

  9. C++로 행렬을 시계 반대 방향 나선형으로 출력하는 방법

    이 문제에서는 2차원 행렬이 주어지며, 우리의 목표는 행렬의 모든 요소를 시계 반대 방향 나선형(counterclockwise spiral) 순서로 출력하는 것입니다.시계 반대 방향 나선형이란?시계 반대 방향 나선형 탐색은 행렬의 왼쪽 위(첫 번째 행, 첫 번째 열)에서 시작하여 아래 → 오른쪽 → 위 → 왼쪽 순서로 방향을 바꿔가며, 외곽에서부터 안쪽으로 나선을 그리듯 이동하는 방식입니다.예를 들어 다음과 같은 4×4 행렬이 있을 때,1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

  10. C++로 인접 중복 문자가 없는 가장 가까운 문자열 구하기

    문제 개요이 문제에서는 하나의 문자열이 주어지며, 우리의 과제는 현재 문자열과 가장 가까우면서(즉, 변경 횟수가 최소인) 인접한 중복 문자를 하나도 포함하지 않는 문자열을 출력하는 것입니다.예시를 통해 문제를 이해해 보겠습니다.입력: string = good 출력: goad위 예시에서 인덱스 1과 2의 문자가 서로 같으므로(o, o), 인덱스 2의 문자를 변경하여 goad를 얻습니다.접근 방법이 문제는 그리디(Greedy) 알고리즘으로 해결할 수 있습니다. 문자열을 처음부터 끝까지 순회하면서 다음 과정을 수행합니다. 문자열을 순회하

  11. C++에서 주어진 정렬 알고리즘이 실패하는 배열 찾기

    이 문제에서는 하나의 정렬 알고리즘과 숫자 n이 주어집니다. 우리의 과제는 이 알고리즘이 정렬에 실패하는 n개의 요소를 가진 배열을 출력하는 것입니다. 즉, 해당 알고리즘이 올바르게 동작하지 않는 반례를 찾아야 합니다.알고리즘 분석 a[i+1] swap(a[i], a[j+1])먼저 이 정렬 알고리즘을 자세히 살펴보겠습니다. 이 알고리즘은 두 개의 중첩 루프를 사용합니다. 외부 루프는 1부터 n-1까지 순회하고, 내부 루프는 i부터 n-1까지 순회하면서 각 반복마다 내부 루프의 요소와 외부 루프의 요소 값을 비교하여 순

  12. C++ 경로 합(Path Sum) III – 루트에서 리프까지 합이 일치하는 경로 찾기

    각 노드가 정수 값을 가지는 이진 트리가 주어졌다고 가정해 봅시다. 우리가 해야 할 일은 노드 값의 합이 주어진 목표 값과 같아지는 루트에서 리프까지의 경로를 모두 찾는 것입니다.예를 들어 트리가 [5,4,8,11,null,13,4,7,2,null,null,5,1]과 같이 구성되어 있고, 목표 합(sum)이 22라면 다음 그림과 같습니다.이때 조건을 만족하는 경로는 [[5,4,11,2],[5,8,4,5]] 두 가지입니다.풀이 접근 방식: DFS(깊이 우선 탐색)이 문제는 약간 변형된 DFS(깊이 우선 탐색) 함수를 사용하면 깔끔하게

  13. C++로 두 개의 이진 트리 병합하기

    두 개의 이진 트리 병합이란?두 개의 이진 트리가 있고, 그중 하나를 다른 트리 위에 겹쳐 올린다고 가정해 봅시다. 이때 일부 노드는 서로 겹치게 되고, 나머지 노드는 겹치지 않습니다. 우리의 목표는 이 두 트리를 하나의 새로운 이진 트리로 병합하는 것입니다.병합 규칙은 다음과 같습니다.두 노드가 겹치는 경우: 두 노드의 값을 더한 합을 병합된 노드의 새로운 값으로 사용합니다.한쪽 노드만 존재하는 경우: 값이 있는(null이 아닌) 노드를 그대로 새 트리의 노드로 사용합니다.예를 들어 아래와 같은 두 트리가 있다면 −병합

  14. C++로 풀어보는 칩 이동 최소 비용 문제

    문제 설명여러 개의 칩이 놓여 있고, i번째 칩은 현재 chips[i] 위치에 있다고 가정해 봅시다. 각 칩에 대해 다음 두 가지 연산을 원하는 만큼(0회 포함) 반복해서 수행할 수 있습니다.i번째 칩을 왼쪽 또는 오른쪽으로 2칸 이동한다. 이때 비용은 0입니다.i번째 칩을 왼쪽 또는 오른쪽으로 1칸 이동한다. 이때 비용은 1입니다.처음에 주어지는 칩은 두 개 이상입니다. 모든 칩을 같은 위치로 모으는 데 필요한 최소 비용을 구해야 하며, 최종 위치는 어디든 상관없습니다. 예를 들어 초기 칩 배열이 [2,2,2,3,3]이라면 출력은

  15. C++로 구현하는 2D 그리드 시프트(Shift) 알고리즘

    크기가 m x n인 2차원 그리드와 정수 k가 주어졌을 때, 그리드를 k번 시프트(이동)해야 하는 문제를 생각해 봅시다. 시프트 연산은 다음 규칙에 따라 수행됩니다.그리드의 요소 G[i, j]는 G[i, j + 1] 위치로 이동합니다.각 행의 마지막 요소 G[i, n – 1]은 다음 행의 첫 번째 위치 G[i + 1, 0]으로 이동합니다.그리드의 마지막 요소 G[m - 1, n – 1]은 첫 번째 위치 G[0, 0]으로 이동합니다.예를 들어 그리드가 다음과 같다고 가정해 보겠습니다.123456789한 번 시프트를 수행하면 결과는 다

  16. C++로 연결 리스트의 이진수를 십진수 정수로 변환하는 방법

    단일 연결 리스트(singly-linked list)의 첫 번째 노드를 가리키는 head 포인터가 있다고 가정해 봅시다. 연결 리스트에 있는 각 노드의 값은 0 또는 1이며, 이 연결 리스트는 어떤 숫자의 이진수 표현을 저장하고 있습니다. 우리가 해야 할 일은 연결 리스트에 담긴 이진수를 십진수 값으로 변환하여 반환하는 것입니다. 예를 들어 리스트가 [1,0,1,1,0,1]과 같다면 결과는 45가 됩니다.문제 해결 접근 방식이 문제는 다음 단계를 따라 해결할 수 있습니다.연결 리스트의 각 노드 값을 배열(vector)로 변환합니다.

  17. C/C++에서 2-3 트리(2-3 Tree): 탐색과 삽입 완벽 정리

    2-3 트리란 무엇인가?2-3 트리(2-3 Tree)는 균형 잡힌 트리 데이터 구조의 한 종류로, 자식을 가지는 모든 내부 노드(internal node)가 다음 두 형태 중 하나를 만족해야 합니다.2-노드(2-node): 하나의 데이터 요소와 두 개의 자식 노드를 가짐3-노드(3-node): 두 개의 데이터 요소와 세 개의 자식 노드를 가짐기본 정의내부 노드가 하나의 데이터 요소와 두 개의 자식을 가지면 이를 2-노드라고 부릅니다.내부 노드가 두 개의 데이터 요소와 세 개의 자식을 가지면 이를 3-노드라고 부릅니다.트리 T가 다음

  18. C/C++로 이해하는 2-SAT(2-만족도) 문제: 개념부터 의사코드까지

    2-SAT 문제란?2-SAT(2-만족도, 2-Satisfiability) 문제는 각 절(clause)이 정확히 두 개의 리터럴로 구성된 부울 논리식이 참(true)이 되도록 변수에 값을 배정할 수 있는지를 판단하는 고전적인 알고리즘 문제입니다. 다음 형태의 논리식 f를 생각해 보겠습니다.f = (x1 ∨ y1) ∧ (x2 ∨ y2) ∧ ... ∧ (xn ∨ yn)문제는 단순합니다. "f를 만족시키는 변수 값의 조합이 존재하는가?"절을 함축 명제로 바꾸기핵심 아이디어는 논리학의

  19. C++로 구현하는 3-Way 병합 정렬(Merge Sort) 완벽 가이드

    병합 정렬(Merge Sort)은 배열을 재귀적으로 두 부분으로 나눈 뒤 각각을 정렬하고, 마지막에 하나로 합치는 대표적인 분할 정복(Divide and Conquer) 알고리즘입니다. 그 변형인 3-way 병합 정렬(3-way Merge Sort)은 배열을 두 부분이 아닌 세 부분으로 나눈다는 점에서 차별화됩니다.일반적인 병합 정렬이 배열을 절반 크기의 하위 배열로 계속 쪼개는 방식이라면, 3-way 병합 정렬은 같은 원리로 배열을 1/3 크기의 하위 배열로 나누어 처리합니다.동작 원리3-way 병합 정렬은 다음 단계로 진행됩니다

  20. C++17 초기화문이 포함된 if-else와 switch 문 활용법

    프로그래밍을 하다 보면 함수가 반환한 값을 확인하고, 그 값에 따라 조건부로 다른 동작을 수행해야 하는 경우가 매우 흔합니다. 전통적인 방식으로는 아래와 같이 코드를 작성하게 됩니다.// 어떤 메서드 또는 함수 return_type foo(Params); // Params로 함수를 호출하고 // 반환값을 var1에 저장 auto var1 = foo(Params); if (var1 == /* some value */) { // 무언가 수행 } else { // 다른 작업 수행 }일반적인 if-else 구조일반적인 조건

Total 5981 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:127/300  20-컴퓨터/Page Goto:1 121 122 123 124 125 126 127 128 129 130 131 132 133