문제 소개이 튜토리얼에서는 주어진 문자열로 시작하고 끝나는 부분 문자열의 총 개수를 구하는 프로그램을 작성해 보겠습니다.하나의 문자열과 두 개의 부분 문자열이 주어집니다. 우리가 해야 할 일은 시작 문자열로 시작하고 끝 문자열로 끝나는 서로 다른 부분 문자열의 개수를 세는 것입니다. 먼저 예시를 살펴보며 문제를 이해해 보겠습니다.입력str = getmesomecoffeestart = mend = e출력6주어진 문자열에서 조건을 만족하는 서로 다른 부분 문자열은 총 6개입니다. 바로 me, mesome, mesomemecoffe, m
디지털 루트란 무엇인가? 이 튜토리얼에서는 주어진 숫자의 디지털 루트(digital root)를 구하는 방법을 알아보겠습니다. 디지털 루트는 숫자의 각 자릿수를 모두 더한 후, 그 합이 한 자릿수가 될 때까지 같은 과정을 반복하여 얻는 최종 결과입니다. 예를 들어 12345라면 1+2+3+4+5 = 15이고, 다시 1+5 = 6이므로 디지털 루트는 6이 됩니다. 여기서 다루는 입력값은 문자열 형태의 정수입니다. 숫자가 매우 커서 일반적인 정수 자료형(int, long long 등)에 담을 수 없는 경우에도 처리할 수 있도록 하기 위
이 튜토리얼에서는 두 배열의 요소별 합을 계산하여 별도의 새로운 배열에 저장하는 프로그램을 작성해 보겠습니다.두 개의 배열이 주어지면, 서로 같은 인덱스에 위치한 요소들을 더해야 합니다. 만약 그 합이 한 자릿수가 아니라면, 해당 숫자에서 각 자릿수를 추출하여 새 배열에 하나씩 저장합니다.예시를 통해 문제를 이해해 보겠습니다.입력arr_one = {1, 2, 32, 4, 5} arr_two = {1, 52, 3}출력2 5 4 3 5 4 5문제 해결 절차더미 데이터로 두 개의 배열을 초기화합니다.새 배열의 크기를 미리 알 수 없으므로
이 튜토리얼에서는 n개의 공을 k명의 학생에게 나눠주되, 누구도 같은 색의 공을 두 개 이상 받지 않도록 배분하는 방법을 알아보겠습니다.문제 개요문제의 아이디어는 간단합니다. 서로 다른 색상으로 이루어진 n개의 공이 있고, 이것을 학생들에게 나눠주어야 합니다. 단, 한 학생에게 같은 색의 공을 두 개 이상 줄 수는 없습니다.만약 어떤 색상의 공 개수가 학생 수(k)보다 많다면, 그 색의 공을 모두 나누더라도 반드시 누군가 같은 색의 공을 여러 개 받게 됩니다. 이 경우에는 배분이 불가능하므로 No를 출력해야 합니다.예제 입력n =
이 튜토리얼에서는 하나의 숫자를 서로의 차이가 k가 되도록 두 부분으로 나누는 프로그램을 작성해 보겠습니다.문제 이해하기먼저 예시를 통해 문제를 살펴보겠습니다.입력n = 100 k = 30출력65 35n = 100을 두 수로 나누었을 때 그 차이가 k = 30이 되도록 하는 것입니다. 실제로 65와 35의 합은 100이고, 차이는 정확히 30입니다.수학적 접근 방식본격적으로 문제를 해결하기 전에 약간의 수학적 사고가 필요합니다. 핵심 아이디어는 다음과 같습니다.두 수를 각각 a와 b라고 하면 다음 두 식이 성립합니다.a + b =
개요이 튜토리얼에서는 주어진 숫자를 두 부분으로 나누는 프로그램을 작성해 보겠습니다.문제 자체는 매우 간단합니다. 주어진 숫자를 2로 나눈 값을 첫 번째 숫자로 구하고, 전체 값에서 그 결과를 빼면 두 번째 숫자를 얻을 수 있습니다.주어진 숫자가 n이라면, 두 숫자는 다음과 같이 계산됩니다.a = n / 2 b = n - a여기서 /는 정수 나눗셈 연산자입니다. 따라서 홀수를 입력하더라도 소수점 이하는 버려지며, 두 수의 합은 항상 원래 숫자와 동일하게 유지됩니다.예제 코드실제 동작을 확인하기 위해 코드를 작성해 보겠습니다.#inc
개요이 튜토리얼에서는 주어진 문자열을 N개의 동일한 부분으로 나누는 C++ 프로그램을 작성해 보겠습니다. 만약 문자열을 N등분할 수 없다면 균등 분할이 불가능하다는 메시지를 출력하도록 처리합니다.문제 해결 접근 방식문제를 해결하기 위한 단계는 다음과 같습니다.문자열과 분할 개수 N을 초기화합니다.size 메서드를 사용해 문자열의 길이를 구합니다.문자열을 N개의 부분으로 나눌 수 있는지 확인합니다.균등하게 나눌 수 없다면 안내 메시지를 출력합니다.나눌 수 있다면 문자열을 순회하며 각 부분을 출력합니다.예제 코드전체 코드를 살펴보겠습니
이 튜토리얼에서는 한 배열의 각 요소를 다른 배열 요소들의 곱으로 나누는 프로그램을 작성해 보겠습니다.여기서는 문제를 해결하기 위한 간단한 방법을 사용합니다. 문제 해결 과정을 단계별로 살펴보겠습니다.두 개의 배열을 초기화합니다.두 번째 배열을 순회하면서 모든 요소의 곱을 계산합니다. 이때 값이 0인 요소는 건너뛰어 0으로 나누는 오류를 방지합니다.첫 번째 배열을 순회하면서 각 요소를 두 번째 배열 요소들의 곱으로 나눈 결과를 출력합니다.예제전체 코드를 확인해 보겠습니다.#include <bits/stdc++.h>usin
이 튜토리얼에서는 문자열 형태로 표현된 매우 큰 숫자를 나누는 방법을 알아봅니다.C++의 기본 정수 자료형은 대략 19자리 숫자까지만 저장할 수 있기 때문에, 그 이상의 큰 숫자는 문자열로 표현해야 합니다. 이번 예제에서는 문자열로 주어진 큰 숫자와 나누는 수(제수)가 주어졌을 때, 나눗셈의 결과인 몫을 구하는 프로그램을 작성해 보겠습니다.핵심 아이디어는 간단합니다. 먼저 주어진 숫자에서 제수보다 크거나 같은 부분을 찾아 나눗셈을 수행하고, 그다음 남은 자릿수를 하나씩 붙여가며 나눗셈을 반복하는 것입니다. 이는 우리가 손으로 세로
문제 개요 이 튜토리얼에서는 하나의 숫자를 두 부분으로 나누되, 앞부분은 첫 번째 수로, 뒷부분은 두 번째 수로 각각 나누어 떨어지도록 하는 프로그램을 C++로 작성해 보겠습니다. 문자열 형태의 숫자 하나와 정수 두 개가 주어집니다. 프로그램은 주어진 숫자를 두 부분으로 분할할 수 있는지 판단해야 합니다. 즉, 첫 번째 부분(접두사)은 첫 번째 정수로 나누어 떨어지고, 두 번째 부분(접미사)은 두 번째 정수로 나누어 떨어져야 합니다. 문제 해결 접근 방식 문제를 해결하는 단계는 다음과 같습니다. 숫자 문자열과 나눗셈에 사용할 두
이 튜토리얼에서는 주어진 연결 리스트(Linked List)를 p:q 비율로 두 개의 리스트로 나누는 프로그램을 C++로 작성해 보겠습니다.알고리즘 자체는 매우 간단합니다. 문제 해결 과정을 단계별로 살펴보겠습니다.문제 해결 접근 방식연결 리스트 노드를 위한 구조체(struct)를 정의합니다.더미 데이터로 연결 리스트를 초기화합니다.p:q 비율 값을 설정합니다.연결 리스트의 전체 길이를 구합니다.연결 리스트의 길이가 p + q보다 작으면 p:q 비율로 나누는 것이 불가능합니다.나눌 수 있다면 p번째 노드까지 연결 리스트를 순회합니다
이 튜토리얼에서는 문자열 형태로 주어진 매우 큰 숫자가 12로 나누어 떨어지는지 확인하는 C++ 프로그램을 작성해 보겠습니다. 이 문제는 약간의 수학적 성질을 활용하면 손쉽게 해결할 수 있습니다. 어떤 수가 3으로도 나누어 떨어지고 4로도 나누어 떨어진다면, 그 수는 반드시 12로 나누어 떨어집니다. 각 자리 숫자의 합이 3으로 나누어 떨어지면 그 수는 3의 배수입니다. 마지막 두 자리 숫자가 4로 나누어 떨어지면 그 수는 4의 배수입니다. 이제 위의 성질들을 활용해 프로그램을 완성해 보겠습니다. 예제 코드 그럼 전체 코드를 살펴
이 튜토리얼에서는 주어진 이진수가 비트를 제거했을 때 64로 나누어떨어지는지 확인하는 프로그램을 작성해 보겠습니다.하나의 이진수가 주어지며, 필요에 따라 일부 비트를 자유롭게 삭제할 수 있습니다. 비트를 제거한 결과가 64로 나누어떨어지면 Yes, 그렇지 않으면 No를 출력하면 됩니다.문제 해결 접근 방식핵심 원리는 매우 간단합니다. 64는 2의 6제곱(26)이므로, 어떤 수가 64의 배수라면 이진 표현의 맨 뒤에 반드시 0이 여섯 개 이상 연속으로 위치해야 합니다. 따라서 문자열을 오른쪽에서 왼쪽으로 탐색하면서 0의 개수를 세고,
이 튜토리얼에서는 주어진 매우 큰 숫자가 37로 나누어 떨어지는지 확인하는 C++ 프로그램을 작성해 보겠습니다.이 문제는 약간의 수학적 지식을 활용합니다. 핵심은 1000을 37로 나눈 나머지가 1이라는 성질입니다(999 = 27 × 37). 이 성질 덕분에 숫자를 오른쪽부터 세 자리씩 끊어 각 그룹의 값을 모두 더하더라도 원래 수의 37 배수 여부는 그대로 유지됩니다. 3의 배수 판별법에서 각 자릿수의 합을 구하는 것과 비슷한 원리라고 생각하면 이해하기 쉽습니다.문제 해결 단계숫자를 문자열 형태로 초기화합니다.숫자의 길이가 3으로
이 튜토리얼에서는 나눗셈(/) 연산자를 사용하지 않고 두 수를 나누는 방법을 알아보겠습니다.두 개의 숫자가 주어졌을 때, 프로그램은 나눗셈 연산의 몫(quotient)을 반환해야 합니다.여기서는 뺄셈(-) 연산자를 반복적으로 활용하여 나눗셈을 구현합니다. 핵심 아이디어는 간단합니다. 피제수에서 제수를 계속 빼다가 피제수가 제수보다 작아지면, 그동안 뺀 횟수가 곧 몫이 됩니다.문제 해결 접근 방식단계별로 문제를 해결해 보겠습니다.피제수(dividend)와 제수(divisor)를 초기화합니다.피제수가 0이면 결과도 0이므로 즉시 0을
이 튜토리얼에서는 n²(제곱)의 약수 중에서 n 자신의 약수에 해당하지 않는 수의 개수를 구하는 C++ 프로그램을 작성해 보겠습니다.예를 들어 n이 6이라면 n²은 36입니다. 36의 약수는 1, 2, 3, 4, 6, 9, 12, 18, 36으로 총 9개이며, 이 중 6의 약수인 1, 2, 3, 6을 제외하면 4, 9, 12, 18, 36의 5개가 남습니다. 즉, 정답은 5가 됩니다.문제 해결 접근 방법문제는 매우 직관적이며, 다음 단계를 따라 해결할 수 있습니다.숫자 n을 초기화합니다.약수 개수를 세기 위한 카운터 변수를 초기화합
이 튜토리얼에서는 주어진 숫자가 서로 다른 두 개의 진법에서 모두 회문(palindrome)인지 확인하는 C++ 프로그램을 작성해 보겠습니다.하나의 숫자와 다른 진법의 밑(base)이 주어졌을 때, 해당 숫자가 10진수 체계와 주어진 진법 체계 양쪽 모두에서 회문인지 판별하는 것이 목표입니다.문제 해결 접근 방식문제를 해결하기 위한 단계는 다음과 같습니다.확인할 숫자와 변환할 진법의 밑을 초기화합니다.주어진 숫자가 10진수 체계에서 회문인지 먼저 확인합니다.숫자를 문자열 형태로 다른 진법으로 변환합니다.변환된 문자열이 회문인지 확인
이 튜토리얼에서는 C++의 set 컨테이너를 활용하여 양방향 우선순위 큐(Double-Ended Priority Queue)를 구현하는 방법을 알아보겠습니다.양방향 우선순위 큐란?양방향 우선순위 큐는 최솟값과 최댓값 모두 양쪽 끝에서 효율적으로 조회하고 삭제할 수 있는 자료구조입니다. C++ STL의 set은 내부적으로 균형 이진 탐색 트리를 기반으로 동작하기 때문에 요소가 항상 정렬된 상태로 유지되며, 삽입·삭제·탐색이 모두 O(log n) 시간 복잡도로 처리됩니다. 이러한 특성 덕분에 set만 있으면 양방향 우선순위 큐를 아주
개요이 튜토리얼에서는 배열에서 인접한 두 요소가 같을 때 앞쪽 요소를 두 배로 만들고, 생긴 빈자리를 0으로 채운 뒤, 모든 0을 배열의 끝으로 이동시키는 C++ 프로그램을 작성해 보겠습니다.문제 접근 방법이 문제는 다음 세 단계로 해결할 수 있습니다.두 배로 만들기: 인접한 두 인덱스의 값이 서로 같고 0이 아닌 경우, 앞쪽 요소를 두 배로 만들고 뒤쪽 요소를 0으로 변경합니다.0 채우기: 두 배로 만든 후 생긴 자리를 0으로 채웁니다.0 이동하기: 배열 내 모든 0을 배열의 끝으로 이동시킵니다. 이때 0이 아닌 요소들의 상대적인
이번 튜토리얼에서는 주어진 이진 트리를 더블 트리(Double Tree)로 변환하는 방법을 알아보겠습니다.더블 트리란?더블 트리는 기존 트리의 각 노드 왼쪽에 자신과 같은 값을 가진 새로운 노드를 하나씩 추가하여 만든 트리입니다. 즉, 모든 원래 노드가 복제되어 왼쪽 자식 자리에 삽입된 형태가 됩니다.문제 해결 절차다음 순서대로 문제를 해결할 수 있습니다.노드(node) 클래스를 생성합니다.더미 데이터로 트리를 초기화합니다.트리를 두 배로 만드는 재귀 함수를 작성합니다.트리를 재귀적으로 순회합니다.왼쪽 자식 노드를 변수에 임시 저장