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

C++

  1. C++에서 문자열로 표현된 큰 수를 r로 나눈 나머지 구하기

    이 문제에서는 매우 큰 수를 담고 있는 문자열 num과 정수 R이 주어집니다. 우리의 목표는 이 큰 수를 R로 나눈 나머지를 구하는 C++ 프로그램을 작성하는 것입니다.문제 설명문자열 형태로 주어진 거대한 숫자를 두 자리 정수인 r로 나눈 나머지를 계산해야 합니다. 숫자가 너무 커서 일반적인 정수 자료형에 담을 수 없기 때문에, 문자열 그대로 처리해야 한다는 점이 핵심입니다.예제로 문제 이해하기입력num = 123423450942121r = 54출력7해결 접근 방법나머지를 구하려면 당연히 나눗셈 연산이 필요합니다. 하지만 아주 큰

  2. C++에서 % 연산자 없이 나머지 구하기: 모듈로 연산자를 사용하지 않는 두 가지 방법

    이 문제에서는 두 개의 정수 N과 D가 주어지며, 우리의 목표는 C++에서 모듈로(%) 연산자를 사용하지 않고 나머지를 구하는 프로그램을 작성하는 것입니다. 문제 설명 숫자 N을 D로 나눈 뒤 남는 나머지를 구해야 합니다. 단, 모듈로 또는 % 연산자는 사용할 수 없습니다. 예제로 이해하기 입력 N = 53 D = 3 출력 2 53을 3으로 나누면 몫은 17이고 나머지는 2입니다. 즉, 53 = 3 × 17 + 2라는 관계가 성립합니다. 방법 1: D의 배수를 이용한 방식 가장 직관적인 방법은 N 이하의 수 중에서 D의 배수인 가장

  3. C++ 할선법(Secant Method)으로 방정식의 근 찾기: 구현 예제와 실행 결과

    개요이 튜토리얼에서는 할선법(Secant Method)을 이용해 방정식의 근을 구하는 C++ 프로그램을 살펴보겠습니다. 주어진 방정식에 대해 반복적인 할선법을 적용하여 그 근을 찾는 것이 목표입니다.할선법(Secant Method)이란?할선법은 방정식 f(x) = 0의 근을 수치적으로 계산하는 대표적인 반복(iterative) 알고리즘입니다. 두 개의 초기 근사값 x₁과 x₂를 지나는 직선(할선)을 그리고, 이 직선이 x축과 만나는 교점을 다음 근사값으로 사용하는 방식입니다.뉴턴-랩슨법(Newton-Raphson Method)과 달

  4. C++로 문자열에서 두 번째로 많이 등장하는 문자 찾기

    이 문제에서는 문자열 str이 주어지며, C++로 문자열에서 두 번째로 많이 등장하는 문자를 찾는 프로그램을 작성하는 것이 목표입니다.예시를 통한 문제 이해입력str = abaacabcba출력b위 예시에서 문자 a는 5번, b는 3번, c는 2번 등장합니다. 따라서 가장 많이 등장하는 문자는 a이고, 두 번째로 많이 등장하는 문자는 b가 됩니다.해결 접근 방법문자열에서 두 번째로 많이 등장하는 문자를 찾으려면 각 문자의 등장 횟수를 저장하는 카운트 배열(charCount)을 활용해야 합니다. 이 배열을 이용해 최대 빈도(max)와

  5. C++로 이중 연결 리스트(Doubly Linked List)의 크기 구하기

    이번 글에서는 이중 연결 리스트(Doubly Linked List)가 주어졌을 때, 그 크기(size)를 구하는 프로그램을 C++로 작성해 보겠습니다.이중 연결 리스트란?이중 연결 리스트는 단일 연결 리스트(Singly Linked List)와 달리 양방향 탐색이 가능한 특수한 형태의 연결 리스트입니다. 즉, 앞쪽으로도 뒤쪽으로도 자유롭게 이동할 수 있어 데이터 삽입과 삭제가 더 유연합니다.이중 연결 리스트의 개념을 이해하려면 다음과 같은 핵심 용어를 먼저 알아야 합니다.Link(링크) – 연결 리스트의 각 노드는 요소(elemen

  6. C++에서 직선의 기울기 구하기 – 두 점의 좌표를 활용한 방법

    이 문제에서는 직선 위의 두 점 좌표가 주어지며, 이를 활용해 C++로 직선의 기울기를 구하는 프로그램을 작성하는 것이 목표입니다.문제 설명주어진 직선 위의 두 점 좌표를 이용하여 해당 직선의 기울기를 계산합니다.예제로 이해하기입력p1(-1, 1), p2(3, 3)출력0.5위 예제에서 점 (-1, 1)과 점 (3, 3)을 지나는 직선의 기울기는 0.5입니다.해결 접근 방법직선의 기울기를 구하려면, 직선 위의 임의의 두 점 P1(x1, y1)과 P2(x2, y2)를 이용하는 기하학 공식을 사용하면 됩니다.기울기(Slope) = (y2

  7. C++ 문자열에서 가장 짧은 단어와 가장 긴 단어 찾는 방법

    문제 개요이 문제에서는 하나의 문자열 str이 주어지며, 우리의 과제는 C++에서 문자열 내 가장 짧은 단어와 가장 긴 단어를 찾는 프로그램을 작성하는 것입니다.문제 설명주어진 문자열에 포함된 모든 단어 중에서 길이가 가장 짧은 단어와 가장 긴 단어를 각각 찾아야 합니다. 여기서 단어는 공백 문자( ) 또는 널 문자(\0)를 기준으로 구분됩니다.예시로 문제 이해하기입력str = Learn Programming at TutorialsPoint출력smallest word = at largest word = Tutorialspoint해결

  8. C++에서 주어진 원의 두 부분 사이 최소 각도 차이를 찾는 프로그램

    이 문제에서는 원을 이루는 각 조각의 각도가 담긴 배열이 주어집니다. 우리의 목표는 C++에서 주어진 원의 두 부분 사이의 가장 작은 각도 차이를 찾는 프로그램을 작성하는 것입니다.문제 설명원을 구성하는 모든 조각의 각도가 배열 형태로 주어집니다. 이 조각들을 연속된 형태로만 합쳐서 두 개의 부분을 만들 때, 두 부분의 각도 차이가 최소가 되도록 만들어야 합니다.예제로 문제 이해하기입력ang[] = {90, 45, 90, 135}출력90설명1번째와 2번째 조각을 합치면 90 + 45 = 135가 됩니다.3번째와 4번째 조각을 합치면

  9. C++로 정렬된 두 배열의 중앙값 구하기: 이진 탐색 기반 풀이

    두 개의 정렬된 배열이 주어졌을 때, 이 두 배열 전체의 중앙값(median)을 찾는 문제입니다. 예를 들어 배열이 [1, 5, 8]과 [2, 3, 6, 9]라면, 두 배열을 합쳤을 때 [1, 2, 3, 5, 6, 8, 9]가 되고 총 원소 개수는 7개(홀수)이므로 정답은 가운데 값인 5가 됩니다.이 문제는 두 배열을 실제로 병합하지 않고도 이진 탐색(binary search)을 활용하면 O(log(min(m, n))) 시간 복잡도로 효율적으로 해결할 수 있습니다.해결 접근 방식핵심 아이디어는 작은 배열을 기준으로 분할 지점(par

  10. C++로 구현하는 연결 리스트 K-그룹 단위 노드 뒤집기

    문제 개요연결 리스트(Linked List)가 주어졌을 때, 노드들을 k개씩 묶어서 순서를 뒤집고 수정된 리스트를 반환하는 문제입니다. 여기서 k는 양의 정수이며, 연결 리스트의 전체 길이보다 작거나 같아야 합니다.만약 노드의 총 개수가 k의 배수가 아니라면, 마지막에 남는 노드들은 원래 순서 그대로 유지해야 합니다.예를 들어, 연결 리스트가 [1,2,3,4,5,6,7]이고 k가 3이라면, 결과는 다음과 같습니다.[3,2,1,6,5,4,7]앞의 6개 노드는 3개씩 두 그룹으로 나뉘어 각각 뒤집히지만, 마지막에 남은 노드 7은 원래

  11. C++로 풀어보는 모든 단어 연결 부분 문자열(Substring with Concatenation) 찾기

    문제 설명 문자열 s와 단어 배열 words가 주어졌다고 가정해 보겠습니다. words에 포함된 모든 단어는 길이가 서로 같습니다. 이때 s 안에서 words의 각 단어를 정확히 한 번씩 사용하고, 그 사이에 다른 문자가 하나도 끼어 있지 않은 상태로 이어 붙인 부분 문자열이 시작되는 모든 인덱스를 찾아야 합니다. 예를 들어 입력 문자열이 barfoothefoobarman이고 단어 목록이 [foo, bar]라면 출력은 [0, 9]입니다. 인덱스 0에서 시작하는 부분 문자열은 barfoo, 인덱스 9에서 시작하는 부분 문자열은 foo

  12. C++로 구현하는 스도쿠 솔버: 백트래킹 알고리즘 완전 정복

    스도쿠(Sudoku)는 전 세계적으로 사랑받는 대표적인 숫자 퍼즐입니다. 이 글에서는 C++와 백트래킹(backtracking) 알고리즘을 활용해 주어진 스도쿠 퍼즐을 자동으로 풀어내는 방법을 단계별로 살펴보겠습니다. 스도쿠의 기본 규칙 스도쿠는 9×9 크기의 숫자 격자로 이루어져 있으며, 전체 격자는 다시 3×3 크기의 작은 박스 9개로 나뉩니다. 퍼즐을 풀 때 지켜야 할 규칙은 다음과 같습니다. 숫자는 반드시 1부터 9까지만 사용해야 합니다. 같은 숫자가 한 행, 한 열, 또는 하나의 3×3 박스 안에 중복되어 나타날 수 없습

  13. C++로 구간 삽입 문제 풀기: 새 구간 추가 후 겹치는 구간 병합하기

    문제 이해서로 겹치지 않는 구간(interval)들의 집합이 주어졌다고 가정해 봅시다. 여기에 새로운 구간을 삽입해야 하며, 필요하다면 기존 구간들과 병합할 수 있습니다.예를 들어 입력이 [[1,4],[6,9]]이고 새 구간이 [2,5]라면, [2,5]는 [1,4]와 겹치므로 두 구간이 [1,5]로 병합됩니다. 따라서 최종 출력은 [[1,5],[6,9]]가 됩니다.해결 접근 방법이 문제는 다음 단계를 통해 해결할 수 있습니다.새 구간을 기존 구간 리스트의 맨 끝에 추가합니다.구간 리스트를 시작 지점(start)을 기준으로 오름차순

  14. C++ 텍스트 양쪽 정렬(Justify) 알고리즘 구현 방법

    단어 배열과 최대 너비(maxWidth)가 주어지면, 각 줄이 정확히 maxWidth개의 문자를 갖도록 텍스트를 양쪽 정렬(full justify) 형식으로 포맷해야 합니다. 단어는 탐욕(greedy) 방식으로 배치하며, 즉 각 줄에 가능한 한 많은 단어를 담습니다. 필요할 때 여분의 공백( )을 채워 넣어 모든 줄의 길이를 정확히 maxWidth로 맞춥니다.이때 단어 사이의 여분 공백은 최대한 균등하게 분배해야 합니다. 한 줄의 공백 수가 단어 사이에 고르게 나누어 떨어지지 않는 경우에는 왼쪽 빈 슬롯이 오른쪽 슬롯보다 더 많은

  15. C++로 구현하는 편집 거리(Edit Distance) 알고리즘

    편집 거리(Edit Distance)란?두 개의 문자열 word1과 word2가 주어졌을 때, word1을 word2로 변환하는 데 필요한 최소 연산 횟수를 구하는 문제입니다. 사용할 수 있는 연산은 다음 세 가지입니다.삽입(Insert) : 새로운 문자 하나를 추가삭제(Delete) : 기존 문자 하나를 제거교체(Replace) : 기존 문자를 다른 문자로 변경예를 들어 입력 문자열이 evaluate와 fluctuate라면, 두 문자열을 일치시키기 위해 필요한 최소 연산 횟수는 5입니다.해결 접근 방식이 문제는 대표적인 동적 계획

  16. C++로 최소 윈도우 부분 문자열 구하기: 슬라이딩 윈도우 알고리즘 완벽 정리

    문자열 S와 T가 주어졌을 때, S 안에서 T의 모든 문자를 포함하는 최소 길이의 윈도우(부분 문자열)를 찾는 문제입니다. 예를 들어 S = ABHDAXCVBAGTXATYCB, T = ABC라고 한다면, 결과는 CVBA가 됩니다.이 문제는 슬라이딩 윈도우(Sliding Window) 기법과 해시 맵을 활용하면 효율적으로 해결할 수 있습니다. 핵심 아이디어는 오른쪽 포인터를 확장하며 조건을 만족하는 구간을 찾고, 왼쪽 포인터를 당겨 최소 길이를 유지하는 것입니다.알고리즘 단계문자 빈도를 저장할 맵 m을 생성하고, x의 각 문자별 빈도

  17. C++로 푸는 최대 직사각형(Maximal Rectangle) 문제: 스택 기반 히스토그램 알고리즘 완벽 정리

    0과 1로 이루어진 2차원 이진 행렬(binary matrix)이 주어졌다고 가정해 봅시다. 이때 1로만 채워진 가장 큰 직사각형을 찾아 그 넓이를 반환하는 것이 이번 문제의 목표입니다.이 문제는 각 행을 히스토그램으로 변환한 뒤, 스택(stack)을 활용해 히스토그램에서 가장 큰 직사각형을 구하는 고전적인 기법으로 효율적으로 해결할 수 있습니다. 전체 시간 복잡도는 O(n × m)으로, 완전 탐색 방식보다 훨씬 빠른 성능을 보입니다.해결 접근 방식핵심 아이디어는 다음과 같습니다. 각 행을 순회하면서 해당 열까지 연속된 1의 개수를

  18. C++로 문자열 인터리빙(Interleaving) 여부 확인하기

    문제 개요세 개의 문자열 s1, s2, s3가 주어졌을 때, s3가 s1과 s2의 문자들을 서로 섞어 배치한 결과(인터리빙)로 만들어질 수 있는지 판별하는 문제입니다.예를 들어 s1 = aabcc, s2 = dbbca, s3 = aadbbcbcac이라면, s3는 s1과 s2를 적절히 교차 배치해 만들 수 있으므로 결과는 true(1)가 됩니다.접근 방법: 메모이제이션을 활용한 동적 계획법(DP)이 문제는 재귀 호출과 메모이제이션을 결합한 동적 계획법으로 효율적으로 해결할 수 있습니다. 핵심 아이디어는 s1의 앞부분 i개 문자와 s2

  19. C++로 서로 바뀐 두 노드를 찾아 이진 탐색 트리(BST) 복구하기

    문제 소개 이진 탐색 트리(Binary Search Tree, BST)가 하나 있다고 가정해 보겠습니다. 어떤 이유로 이 트리의 두 노드 값이 서로 교환되어 BST의 성질이 깨졌다면, 트리의 구조는 그대로 유지한 채 두 값을 다시 되돌려 올바른 이진 탐색 트리로 복구해야 합니다. 예를 들어 아래 왼쪽과 같은 트리가 주어지면, 복구된 트리는 오른쪽과 같습니다. 해결 접근 방식 이 문제의 핵심은 중위 순회(inorder traversal)입니다. 올바른 BST를 중위 순회하면 항상 오름차순으로 정렬된 값이 얻어집니다. 따라서 두 노드

  20. C++ 동적 계획법으로 풀어보는 고유한 부분 수열(Distinct Subsequences) 문제

    문제 개요두 문자열 S와 T가 주어졌을 때, S에서 만들 수 있는 부분 수열 중 T와 동일한 것의 개수를 구하는 문제입니다.여기서 부분 수열(subsequence)이란 원본 문자열에서 일부 문자(전혀 제거하지 않아도 됨)를 삭제하되, 남은 문자들의 상대적인 순서는 그대로 유지한 채 만들어진 새로운 문자열을 의미합니다. 예를 들어 ACE는 ABCDE의 부분 수열이지만, 순서가 뒤바뀐 AEC는 부분 수열이 아닙니다.입력 문자열이 baalllloonnn과 balloon이라면, 총 36가지 서로 다른 선택 방법이 존재합니다.해결 접근 방식

Total 5981 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:175/300  20-컴퓨터/Page Goto:1 169 170 171 172 173 174 175 176 177 178 179 180 181