이 문제에서는 매우 큰 수를 담고 있는 문자열 num과 정수 R이 주어집니다. 우리의 목표는 이 큰 수를 R로 나눈 나머지를 구하는 C++ 프로그램을 작성하는 것입니다.문제 설명문자열 형태로 주어진 거대한 숫자를 두 자리 정수인 r로 나눈 나머지를 계산해야 합니다. 숫자가 너무 커서 일반적인 정수 자료형에 담을 수 없기 때문에, 문자열 그대로 처리해야 한다는 점이 핵심입니다.예제로 문제 이해하기입력num = 123423450942121r = 54출력7해결 접근 방법나머지를 구하려면 당연히 나눗셈 연산이 필요합니다. 하지만 아주 큰
이 문제에서는 두 개의 정수 N과 D가 주어지며, 우리의 목표는 C++에서 모듈로(%) 연산자를 사용하지 않고 나머지를 구하는 프로그램을 작성하는 것입니다. 문제 설명 숫자 N을 D로 나눈 뒤 남는 나머지를 구해야 합니다. 단, 모듈로 또는 % 연산자는 사용할 수 없습니다. 예제로 이해하기 입력 N = 53 D = 3 출력 2 53을 3으로 나누면 몫은 17이고 나머지는 2입니다. 즉, 53 = 3 × 17 + 2라는 관계가 성립합니다. 방법 1: D의 배수를 이용한 방식 가장 직관적인 방법은 N 이하의 수 중에서 D의 배수인 가장
개요이 튜토리얼에서는 할선법(Secant Method)을 이용해 방정식의 근을 구하는 C++ 프로그램을 살펴보겠습니다. 주어진 방정식에 대해 반복적인 할선법을 적용하여 그 근을 찾는 것이 목표입니다.할선법(Secant Method)이란?할선법은 방정식 f(x) = 0의 근을 수치적으로 계산하는 대표적인 반복(iterative) 알고리즘입니다. 두 개의 초기 근사값 x₁과 x₂를 지나는 직선(할선)을 그리고, 이 직선이 x축과 만나는 교점을 다음 근사값으로 사용하는 방식입니다.뉴턴-랩슨법(Newton-Raphson Method)과 달
이 문제에서는 문자열 str이 주어지며, C++로 문자열에서 두 번째로 많이 등장하는 문자를 찾는 프로그램을 작성하는 것이 목표입니다.예시를 통한 문제 이해입력str = abaacabcba출력b위 예시에서 문자 a는 5번, b는 3번, c는 2번 등장합니다. 따라서 가장 많이 등장하는 문자는 a이고, 두 번째로 많이 등장하는 문자는 b가 됩니다.해결 접근 방법문자열에서 두 번째로 많이 등장하는 문자를 찾으려면 각 문자의 등장 횟수를 저장하는 카운트 배열(charCount)을 활용해야 합니다. 이 배열을 이용해 최대 빈도(max)와
이번 글에서는 이중 연결 리스트(Doubly Linked List)가 주어졌을 때, 그 크기(size)를 구하는 프로그램을 C++로 작성해 보겠습니다.이중 연결 리스트란?이중 연결 리스트는 단일 연결 리스트(Singly Linked List)와 달리 양방향 탐색이 가능한 특수한 형태의 연결 리스트입니다. 즉, 앞쪽으로도 뒤쪽으로도 자유롭게 이동할 수 있어 데이터 삽입과 삭제가 더 유연합니다.이중 연결 리스트의 개념을 이해하려면 다음과 같은 핵심 용어를 먼저 알아야 합니다.Link(링크) – 연결 리스트의 각 노드는 요소(elemen
이 문제에서는 직선 위의 두 점 좌표가 주어지며, 이를 활용해 C++로 직선의 기울기를 구하는 프로그램을 작성하는 것이 목표입니다.문제 설명주어진 직선 위의 두 점 좌표를 이용하여 해당 직선의 기울기를 계산합니다.예제로 이해하기입력p1(-1, 1), p2(3, 3)출력0.5위 예제에서 점 (-1, 1)과 점 (3, 3)을 지나는 직선의 기울기는 0.5입니다.해결 접근 방법직선의 기울기를 구하려면, 직선 위의 임의의 두 점 P1(x1, y1)과 P2(x2, y2)를 이용하는 기하학 공식을 사용하면 됩니다.기울기(Slope) = (y2
문제 개요이 문제에서는 하나의 문자열 str이 주어지며, 우리의 과제는 C++에서 문자열 내 가장 짧은 단어와 가장 긴 단어를 찾는 프로그램을 작성하는 것입니다.문제 설명주어진 문자열에 포함된 모든 단어 중에서 길이가 가장 짧은 단어와 가장 긴 단어를 각각 찾아야 합니다. 여기서 단어는 공백 문자( ) 또는 널 문자(\0)를 기준으로 구분됩니다.예시로 문제 이해하기입력str = Learn Programming at TutorialsPoint출력smallest word = at largest word = Tutorialspoint해결
이 문제에서는 원을 이루는 각 조각의 각도가 담긴 배열이 주어집니다. 우리의 목표는 C++에서 주어진 원의 두 부분 사이의 가장 작은 각도 차이를 찾는 프로그램을 작성하는 것입니다.문제 설명원을 구성하는 모든 조각의 각도가 배열 형태로 주어집니다. 이 조각들을 연속된 형태로만 합쳐서 두 개의 부분을 만들 때, 두 부분의 각도 차이가 최소가 되도록 만들어야 합니다.예제로 문제 이해하기입력ang[] = {90, 45, 90, 135}출력90설명1번째와 2번째 조각을 합치면 90 + 45 = 135가 됩니다.3번째와 4번째 조각을 합치면
두 개의 정렬된 배열이 주어졌을 때, 이 두 배열 전체의 중앙값(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
문제 개요연결 리스트(Linked List)가 주어졌을 때, 노드들을 k개씩 묶어서 순서를 뒤집고 수정된 리스트를 반환하는 문제입니다. 여기서 k는 양의 정수이며, 연결 리스트의 전체 길이보다 작거나 같아야 합니다.만약 노드의 총 개수가 k의 배수가 아니라면, 마지막에 남는 노드들은 원래 순서 그대로 유지해야 합니다.예를 들어, 연결 리스트가 [1,2,3,4,5,6,7]이고 k가 3이라면, 결과는 다음과 같습니다.[3,2,1,6,5,4,7]앞의 6개 노드는 3개씩 두 그룹으로 나뉘어 각각 뒤집히지만, 마지막에 남은 노드 7은 원래
문제 설명 문자열 s와 단어 배열 words가 주어졌다고 가정해 보겠습니다. words에 포함된 모든 단어는 길이가 서로 같습니다. 이때 s 안에서 words의 각 단어를 정확히 한 번씩 사용하고, 그 사이에 다른 문자가 하나도 끼어 있지 않은 상태로 이어 붙인 부분 문자열이 시작되는 모든 인덱스를 찾아야 합니다. 예를 들어 입력 문자열이 barfoothefoobarman이고 단어 목록이 [foo, bar]라면 출력은 [0, 9]입니다. 인덱스 0에서 시작하는 부분 문자열은 barfoo, 인덱스 9에서 시작하는 부분 문자열은 foo
스도쿠(Sudoku)는 전 세계적으로 사랑받는 대표적인 숫자 퍼즐입니다. 이 글에서는 C++와 백트래킹(backtracking) 알고리즘을 활용해 주어진 스도쿠 퍼즐을 자동으로 풀어내는 방법을 단계별로 살펴보겠습니다. 스도쿠의 기본 규칙 스도쿠는 9×9 크기의 숫자 격자로 이루어져 있으며, 전체 격자는 다시 3×3 크기의 작은 박스 9개로 나뉩니다. 퍼즐을 풀 때 지켜야 할 규칙은 다음과 같습니다. 숫자는 반드시 1부터 9까지만 사용해야 합니다. 같은 숫자가 한 행, 한 열, 또는 하나의 3×3 박스 안에 중복되어 나타날 수 없습
문제 이해서로 겹치지 않는 구간(interval)들의 집합이 주어졌다고 가정해 봅시다. 여기에 새로운 구간을 삽입해야 하며, 필요하다면 기존 구간들과 병합할 수 있습니다.예를 들어 입력이 [[1,4],[6,9]]이고 새 구간이 [2,5]라면, [2,5]는 [1,4]와 겹치므로 두 구간이 [1,5]로 병합됩니다. 따라서 최종 출력은 [[1,5],[6,9]]가 됩니다.해결 접근 방법이 문제는 다음 단계를 통해 해결할 수 있습니다.새 구간을 기존 구간 리스트의 맨 끝에 추가합니다.구간 리스트를 시작 지점(start)을 기준으로 오름차순
단어 배열과 최대 너비(maxWidth)가 주어지면, 각 줄이 정확히 maxWidth개의 문자를 갖도록 텍스트를 양쪽 정렬(full justify) 형식으로 포맷해야 합니다. 단어는 탐욕(greedy) 방식으로 배치하며, 즉 각 줄에 가능한 한 많은 단어를 담습니다. 필요할 때 여분의 공백( )을 채워 넣어 모든 줄의 길이를 정확히 maxWidth로 맞춥니다.이때 단어 사이의 여분 공백은 최대한 균등하게 분배해야 합니다. 한 줄의 공백 수가 단어 사이에 고르게 나누어 떨어지지 않는 경우에는 왼쪽 빈 슬롯이 오른쪽 슬롯보다 더 많은
편집 거리(Edit Distance)란?두 개의 문자열 word1과 word2가 주어졌을 때, word1을 word2로 변환하는 데 필요한 최소 연산 횟수를 구하는 문제입니다. 사용할 수 있는 연산은 다음 세 가지입니다.삽입(Insert) : 새로운 문자 하나를 추가삭제(Delete) : 기존 문자 하나를 제거교체(Replace) : 기존 문자를 다른 문자로 변경예를 들어 입력 문자열이 evaluate와 fluctuate라면, 두 문자열을 일치시키기 위해 필요한 최소 연산 횟수는 5입니다.해결 접근 방식이 문제는 대표적인 동적 계획
문자열 S와 T가 주어졌을 때, S 안에서 T의 모든 문자를 포함하는 최소 길이의 윈도우(부분 문자열)를 찾는 문제입니다. 예를 들어 S = ABHDAXCVBAGTXATYCB, T = ABC라고 한다면, 결과는 CVBA가 됩니다.이 문제는 슬라이딩 윈도우(Sliding Window) 기법과 해시 맵을 활용하면 효율적으로 해결할 수 있습니다. 핵심 아이디어는 오른쪽 포인터를 확장하며 조건을 만족하는 구간을 찾고, 왼쪽 포인터를 당겨 최소 길이를 유지하는 것입니다.알고리즘 단계문자 빈도를 저장할 맵 m을 생성하고, x의 각 문자별 빈도
0과 1로 이루어진 2차원 이진 행렬(binary matrix)이 주어졌다고 가정해 봅시다. 이때 1로만 채워진 가장 큰 직사각형을 찾아 그 넓이를 반환하는 것이 이번 문제의 목표입니다.이 문제는 각 행을 히스토그램으로 변환한 뒤, 스택(stack)을 활용해 히스토그램에서 가장 큰 직사각형을 구하는 고전적인 기법으로 효율적으로 해결할 수 있습니다. 전체 시간 복잡도는 O(n × m)으로, 완전 탐색 방식보다 훨씬 빠른 성능을 보입니다.해결 접근 방식핵심 아이디어는 다음과 같습니다. 각 행을 순회하면서 해당 열까지 연속된 1의 개수를
문제 개요세 개의 문자열 s1, s2, s3가 주어졌을 때, s3가 s1과 s2의 문자들을 서로 섞어 배치한 결과(인터리빙)로 만들어질 수 있는지 판별하는 문제입니다.예를 들어 s1 = aabcc, s2 = dbbca, s3 = aadbbcbcac이라면, s3는 s1과 s2를 적절히 교차 배치해 만들 수 있으므로 결과는 true(1)가 됩니다.접근 방법: 메모이제이션을 활용한 동적 계획법(DP)이 문제는 재귀 호출과 메모이제이션을 결합한 동적 계획법으로 효율적으로 해결할 수 있습니다. 핵심 아이디어는 s1의 앞부분 i개 문자와 s2
문제 소개 이진 탐색 트리(Binary Search Tree, BST)가 하나 있다고 가정해 보겠습니다. 어떤 이유로 이 트리의 두 노드 값이 서로 교환되어 BST의 성질이 깨졌다면, 트리의 구조는 그대로 유지한 채 두 값을 다시 되돌려 올바른 이진 탐색 트리로 복구해야 합니다. 예를 들어 아래 왼쪽과 같은 트리가 주어지면, 복구된 트리는 오른쪽과 같습니다. 해결 접근 방식 이 문제의 핵심은 중위 순회(inorder traversal)입니다. 올바른 BST를 중위 순회하면 항상 오름차순으로 정렬된 값이 얻어집니다. 따라서 두 노드
문제 개요두 문자열 S와 T가 주어졌을 때, S에서 만들 수 있는 부분 수열 중 T와 동일한 것의 개수를 구하는 문제입니다.여기서 부분 수열(subsequence)이란 원본 문자열에서 일부 문자(전혀 제거하지 않아도 됨)를 삭제하되, 남은 문자들의 상대적인 순서는 그대로 유지한 채 만들어진 새로운 문자열을 의미합니다. 예를 들어 ACE는 ABCDE의 부분 수열이지만, 순서가 뒤바뀐 AEC는 부분 수열이 아닙니다.입력 문자열이 baalllloonnn과 balloon이라면, 총 36가지 서로 다른 선택 방법이 존재합니다.해결 접근 방식