개요이 튜토리얼에서는 C++를 사용하여 주어진 숫자 n보다 작은 값으로 만들 수 있는 고유한(unique) 숫자 쌍을 모두 찾아 출력하는 방법을 알아봅니다.예를 들어 n = 5가 주어지면, 1부터 4 사이의 서로 다른 두 숫자로 구성된 쌍인 (1,2), (1,3), (1,4), (2,3), (2,4), (3,4)를 얻을 수 있습니다.문제 해결 접근 방식이 문제는 중첩 반복문(nested loop)을 활용하면 간단하게 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.찾고자 하는 기준이 되는 숫자 n을 초기화합니다.바깥쪽 반복문으
이 튜토리얼에서는 하나의 정수가 중복되지 않는 자연수들의 n제곱의 합으로 표현될 수 있는 경우의 수를 구하는 프로그램을 작성해 보겠습니다. 두 개의 정수 number와 power가 주어졌을 때, 주어진 number를 서로 다른 자연수들의 n제곱의 합으로 나타낼 수 있는 방법이 총 몇 가지인지 구해야 합니다. 예시를 통해 살펴보겠습니다. 입력 − number = 50, power = 2 출력 − 3 50은 다음과 같이 세 가지 방법으로 표현할 수 있습니다. 1² + 7² = 1 + 49 = 50 3² + 4² + 5² = 9 + 1
이 튜토리얼에서는 선거의 최종 승자를 찾아내는 C++ 프로그램을 작성해 보겠습니다. 각 후보가 선거에서 받은 득표 정보가 문자열 배열로 주어지며, 이를 집계해 가장 많은 표를 얻은 후보를 가려내야 합니다. 먼저 예시부터 살펴보겠습니다. 입력 {"A", "B", "C", "B", "A", "C", "D", "D", "A", "B", "D"
이번 튜토리얼에서는 이진 배열에서 0을 뒤집었을 때 연속된 1의 개수가 최대가 되도록 뒤집어야 할 0의 인덱스를 찾는 방법을 알아보겠습니다.이 문제는 슬라이딩 윈도우(Sliding Window) 기법을 사용하면 효율적으로 해결할 수 있습니다. 핵심 아이디어는 최대로 뒤집을 수 있는 0의 개수를 초과하지 않는 범위 내에서 가장 긴 연속 구간(윈도우)을 찾는 것입니다.문제 해결 단계배열과 뒤집을 수 있는 최대 0의 개수(maxZeroes)를 초기화합니다.윈도우의 시작 인덱스(start), 끝 인덱스(end)와 함께 필요한 변수들을 선언
이 튜토리얼에서는 분수 a/b의 분자와 분모에 더했을 때 다른 분수 c/d가 되도록 만드는 값 ΔX를 계산하는 C++ 프로그램을 작성해 보겠습니다. 즉, 다음 방정식을 만족하는 ΔX를 찾는 것이 목표입니다.(a + ΔX) / (b + ΔX) = c / d수학적 접근 방법이 문제는 약간의 대수적 유도만 있으면 아주 간단하게 해결할 수 있습니다. 방정식 양변에 교차 곱셈(cross multiplication)을 적용한 뒤, ΔX 항들을 한쪽으로 모아 정리하면 됩니다.d × (a + ΔX) = c × (b + ΔX)ad + d·ΔX =
이 튜토리얼에서는 각 배열 요소를 나눴을 때 나머지가 모두 같아지는 수 k를 찾는 프로그램을 C++로 작성해 보겠습니다. 먼저 예시를 통해 문제를 이해해 봅시다.입력 − arr = {10, 4, 2}출력 − 1 2핵심 원리두 수 x, y(x > y)가 있고 두 수의 차이를 x − y = d라고 가정해 보겠습니다. 그러면 x = y + d로 표현할 수 있습니다.여기서 x % k = y % k를 만족하는 수 k가 존재한다고 해봅시다. 이 조건을 이용해 양변에 k에 대한 나머지 연산을 적용하고 d의 값을 유도해 보겠습니다.x % k
개요이 튜토리얼에서는 주어진 숫자의 각 자릿수를 계속 더하여 최종적으로 한 자리 수가 될 때까지 반복하는 프로그램을 작성해 보겠습니다. 먼저 예제를 통해 문제를 이해해 보겠습니다.입력 − 4543출력 − 7문제 해결 접근 방법이 문제는 다음 단계를 통해 해결할 수 있습니다.숫자를 초기화합니다.합계 변수를 0으로 초기화합니다.합이 9 이하가 될 때까지 반복하며, 모듈로(%) 연산자를 사용해 각 자릿수를 합계에 더합니다.최종 합계를 출력합니다.예제 코드실제 코드를 살펴보겠습니다.#include <bits/stdc++.h>us
C++ 프로그래밍에서 숫자의 패리티(parity)는 해당 수를 이진수로 표현했을 때 1로 설정된 비트의 개수가 짝수인지 홀수인지를 나타내는 속성입니다. 이 튜토리얼에서는 반복문 없이 비트 연산만으로 숫자의 패리티를 빠르게 구하는 프로그램을 작성해 보겠습니다. 패리티 계산 원리 모든 비트를 하나씩 검사하는 방법은 비효율적입니다. 대신 XOR(^) 연산과 오른쪽 시프트(>>) 연산을 조합하면 32비트 정수의 패리티를 단 5단계, 즉 상수 시간 O(1) 안에 구할 수 있습니다. 핵심 아이디어는 비트 범위를 절반씩 줄여 가면서
이 튜토리얼에서는 C++를 활용해 포물선의 꼭짓점(vertex), 초점(focus), 준선(directrix)을 구하는 방법을 알아봅니다. 포물선 방정식을 이루는 세 개의 상수 x, y, z가 주어져 있다고 가정하고 진행합니다. 일반적인 이차함수 y = ax² + bx + c에서 계수 a = x, b = y, 상수항 c = z에 해당한다고 생각하면 이해하기 쉽습니다. 꼭짓점, 초점, 준선은 복잡한 과정 없이 아래의 공식만으로 간단하게 계산할 수 있습니다. 꼭짓점(Vertex): (-y/2x, (4xz - y²) / 4x) 초점(
이 튜토리얼에서는 주어진 숫자의 팩토리얼(계승) 값을 계산한 뒤, 그 결과의 첫 번째 자릿수를 구하는 프로그램을 C++로 작성해 보겠습니다. 먼저 간단한 예시를 살펴볼까요?입력 − 7출력 − 57! = 5040이므로, 첫 번째 자릿수인 5가 출력됩니다.문제 해결 단계숫자를 초기화합니다.반복문을 사용하여 해당 숫자의 팩토리얼을 계산합니다.팩토리얼 값이 한 자리 숫자가 될 때까지 10으로 계속 나눕니다.예제 코드위 단계를 구현한 전체 코드를 확인해 보세요.#include <bits/stdc++.h> using namespac
이 튜토리얼에서는 C++를 사용해 배열에 포함된 모든 숫자의 곱에서 첫 번째 자릿수를 구하는 방법을 알아보겠습니다.문제 해결 접근 방식문제를 해결하는 단계는 다음과 같습니다.배열을 초기화합니다.배열 내 모든 요소의 곱을 계산합니다.곱한 결과가 10보다 작아질 때까지 10으로 계속 나눕니다.마지막에 남은 한 자릿수를 출력합니다.예제 코드전체 코드를 살펴보겠습니다.#include <bits/stdc++.h> using namespace std; // 배열 요소들의 곱을 계산하는 함수 int productOfArrayDigi
개요이 튜토리얼에서는 1부터 n까지의 자연수를 두 개의 그룹으로 나눌 수 있는지 확인하는 방법을 알아봅니다. 나누기가 가능하려면 다음 두 가지 조건을 반드시 만족해야 합니다.두 그룹의 합의 절대적인 차이가 m이어야 합니다.두 합의 최대공약수(GCD)가 1이어야 합니다. 즉, 두 수가 서로소(코프라임) 관계여야 합니다.해결 접근 방식1부터 n까지 자연수의 총합은 (n*(n+1))/2 공식으로 구할 수 있습니다. 전체 합과 목표 차이 m을 이미 알고 있으므로, 이를 이용해 각 그룹의 합인 sumOne과 sumTwo를 계산할 수 있습니다
이 튜토리얼에서는 주어진 문자열에서 첫 번째 비반복 문자(중복되지 않는 문자)를 찾는 방법을 배워보겠습니다. 먼저 예시를 통해 문제를 이해해 보겠습니다.입력 − tutorialspoint출력 − u문자열 tutorialspoint에서 t는 세 번, o와 i는 두 번 등장하지만, 가장 앞쪽에 위치하면서 딱 한 번만 등장하는 문자는 u입니다. 따라서 출력 결과는 u가 됩니다.문제 해결 접근 방식이 문제는 다음 단계를 거쳐 해결할 수 있습니다.문자열을 초기화합니다.각 문자의 빈도수와 인덱스를 저장할 맵(map)을 초기화합니다.문자열을 순
이 튜토리얼에서는 약수의 개수가 n보다 큰 첫 번째 삼각수를 찾는 방법을 알아보겠습니다.먼저 삼각수(Triangular Number)란 무엇인지 간단히 짚고 넘어가겠습니다. 삼각수란 1부터 어떤 자연수 k까지의 합으로 표현할 수 있는 수를 말합니다. 즉, T(k) = 1 + 2 + 3 + ... + k = k × (k + 1) / 2 형태로 나타낼 수 있는 수입니다. 예를 들어 1, 3, 6, 10, 15 등이 삼각수에 해당합니다.그렇다면 주어진 수가 삼각수인지 어떻게 판별할 수 있을까요? 임의의 지점까지 자연수의 합이 그 수와 같
이 튜토리얼에서는 주어진 문자열에서 첫 번째 대문자를 찾는 방법을 알아보겠습니다. 먼저 간단한 예시를 살펴볼까요?입력: Tutorialspoint출력: T이 문제는 크게 두 가지 방식으로 해결할 수 있습니다. 하나는 반복문을 사용하는 방법이고, 다른 하나는 재귀 함수를 사용하는 방법입니다. 각각 자세히 살펴보겠습니다.방법 1: 반복문(Iterative) 활용반복문을 사용한 해결 절차는 다음과 같습니다.문자열을 초기화합니다.문자열을 처음부터 끝까지 순회합니다.isupper 함수를 사용해 현재 문자가 대문자인지 확인합니다.대문자라면 해
이 튜토리얼에서는 운영체제의 메모리 관리 기법 중 하나인 고정 분할(Fixed Partitioning)에 대해 알아보겠습니다. 고정 분할이란? 고정 분할은 운영체제에서 메모리를 관리하는 전통적인 기법 중 하나입니다. 이 기법은 전체 메모리를 크기가 같은 여러 개의 블록(파티션)으로 나누며, 각 블록의 크기는 시스템이 시작되기 전에 미리 정해지기 때문에 실행 중에는 변경할 수 없습니다. 각 파티션에는 하나의 프로세스만 할당될 수 있으며, 프로세스는 연속된(contiguous) 메모리 공간에 배치됩니다. 프로세스의 크기가 파티션 크기보
이 튜토리얼에서는 이진 트리(binary tree)에서 가장 깊은 왼쪽 리프 노드(deepest left leaf node)를 찾는 방법을 알아보겠습니다. 먼저 예제로 사용할 이진 트리를 살펴보겠습니다. A B CD E F G위 트리에서 가장 깊은
개요이 튜토리얼에서는 C++로 구현된 이중 연결 리스트(doubly linked list)에서 주어진 위치에 있는 노드를 삭제하는 방법을 알아봅니다.문제 해결 접근 방식문제를 해결하기 위한 단계는 다음과 같습니다.구조체 정의: 데이터(data)와 이전·다음 노드를 가리키는 포인터(prev, next)를 멤버로 가지는 구조체(struct)를 작성합니다.삽입 함수 작성: 이중 연결 리스트에 새 노드를 삽입하는 함수를 작성합니다.리스트 초기화: 더미(dummy) 데이터로 이중 연결 리스트를 초기화합니다.삭제할 위치 지정: 삭제할 노드의
이 튜토리얼에서는 C++를 사용해 단일 연결 리스트(Singly Linked List)에서 주어진 위치의 노드를 삭제하는 방법을 알아봅니다. 먼저 문제 해결 과정을 단계별로 정리한 뒤, 실제로 동작하는 코드까지 함께 살펴보겠습니다. 문제 해결 단계 구조체 정의 – 데이터(data)와 다음 노드를 가리키는 포인터(next)를 멤버로 갖는 구조체를 작성합니다. 삽입 함수 작성 – 새 노드를 연결 리스트에 추가하는 함수를 구현합니다. 연결 리스트 초기화 – 더미 데이터를 이용해 단일 연결 리스트를 만듭니다. 삭제 위치 지정 – 삭제할
개요 이 튜토리얼에서는 단일 연결 리스트(Singly Linked List)에서 헤드 포인터 없이 노드를 삭제하는 방법을 알아봅니다. 일반적으로 연결 리스트에서 노드를 삭제하려면 이전 노드에 접근할 수 있어야 하지만, 헤드 포인터가 주어지지 않은 상황에서는 전혀 다른 접근 방식이 필요합니다. 핵심 아이디어와 문제 해결 단계 여기서 핵심은 삭제하려는 노드 자체를 지우는 대신, 다음 노드의 데이터를 현재 노드로 복사한 뒤 다음 노드를 제거하는 것입니다. 그러면 결과적으로 해당 위치의 노드가 삭제된 것과 같은 효과를 얻을 수 있습니다.