개요이 튜토리얼에서는 어떤 숫자 X에 그 자릿수들의 합을 더했을 때 주어진 수 N과 같아지는 경우를 찾는 방법을 알아보겠습니다.예를 들어, 76은 76 + (7 + 6) = 89가 되므로, N이 89일 때 정답은 76입니다. 이처럼 숫자 자체와 각 자릿수의 합을 더한 값이 목표값 N이 되는 수를 찾는 것이 이 문제의 핵심입니다.접근 방법핵심 아이디어는 매우 간단합니다. 주어진 숫자 N을 기준으로 좌우 100개 범위 안의 숫자들만 확인하면 됩니다.N ≤ 1,000,000,000이고 자릿수의 합은 최대 100을 넘지 않기 때문에, 정답
이 튜토리얼에서는 이진 탐색 트리(Binary Search Tree, BST)에서 주어진 숫자와 합이 같은 쌍(pair)을 찾는 프로그램을 작성해 보겠습니다.쌍을 효율적으로 찾기 위해 트리의 값들을 두 개의 서로 다른 리스트에 저장하는 방식을 사용합니다. 그럼 문제를 해결하는 단계를 하나씩 살펴보겠습니다.이진 트리를 위한 구조체(struct) 노드를 생성합니다.이진 탐색 트리에 새 노드를 삽입하는 함수를 작성합니다.이진 탐색 트리에서는 루트보다 작은 요소들은 왼쪽에, 큰 요소들은 오른쪽에 위치한다는 규칙을 기억하세요.트리의 왼쪽 노
개요이 튜토리얼에서는 배열에서 분할 지점(partition point)을 찾는 방법을 알아봅니다. 분할 지점이란 해당 지점을 기준으로 왼쪽에 있는 모든 요소는 현재 값보다 작고, 오른쪽에 있는 모든 요소는 현재 값보다 큰 위치를 의미합니다.예를 들어 배열 {4, 3, 5, 6, 7}이 있다면, 값 5가 분할 지점입니다. 왼쪽의 4와 3은 모두 5보다 작고, 오른쪽의 6과 7은 모두 5보다 크기 때문입니다.문제 해결 접근 방식다음 단계를 따라 문제를 해결할 수 있습니다.배열을 초기화합니다.배열의 각 요소를 순회하면서 다음을 확인합니다
이 튜토리얼에서는 C++를 사용하여 2차원 배열에서 피크(peak) 요소를 찾는 프로그램을 작성하는 방법을 알아보겠습니다.피크 요소란 무엇인가?피크 요소란 상하좌우에 인접한 모든 요소보다 값이 큰 요소를 의미합니다. 즉, 특정 요소의 위, 아래, 왼쪽, 오른쪽 값이 모두 해당 요소보다 작다면 그 요소를 피크 요소라고 부릅니다.문제 해결 접근 방법2차원 배열은 모서리, 테두리, 내부 영역에 따라 인접 요소의 개수가 다르기 때문에 위치별로 조건을 나누어 검사해야 합니다. 문제를 해결하는 단계는 다음과 같습니다.더미 데이터로 2차원 배열
이 튜토리얼에서는 주어진 연결 리스트(Linked List)에서 피크 요소(Peak Element)를 찾는 프로그램을 작성해 보겠습니다.피크 요소란 인접한 요소들보다 값이 큰 요소를 의미합니다. 그럼 문제를 해결하는 단계를 하나씩 살펴보겠습니다.문제 해결 접근 방법연결 리스트를 위한 구조체 노드(struct Node)를 생성합니다.더미 데이터로 연결 리스트를 만듭니다.연결 리스트가 비어 있거나 길이가 1인 경우와 같은 기본 케이스(base case)를 먼저 처리합니다.첫 번째 요소를 previous 변수에 저장합니다.연결 리스트를
C++에서 피크 요소란? 이 튜토리얼에서는 주어진 배열에서 피크(peak) 요소를 찾는 프로그램을 C++로 작성해 보겠습니다. 피크 요소란 자신의 양옆에 있는 인접 요소보다 크거나 같은 값을 가지는 요소를 말합니다. 배열에는 피크 요소가 여러 개 존재할 수 있으며, 이 예제에서는 그중 하나를 찾아 반환합니다. 문제 해결 접근 방식 문제를 해결하는 단계는 다음과 같습니다. 테스트용 더미 데이터로 배열을 초기화합니다. 첫 번째 요소와 마지막 요소가 피크 조건을 만족하는지 먼저 확인합니다. 두 번째 요소부터 배열을 순회하면서 다음을
개요이 글에서는 세 개의 연결 리스트(Linked List)가 있을 때, 각 리스트에서 하나씩 선택한 세 값의 합이 주어진 숫자와 일치하는 첫 번째 삼중항(triplet)을 찾는 C++ 프로그램을 작성해 보겠습니다.가장 기본적인 접근 방법은 세 개의 중첩 반복문(nested loop)을 사용하여 가능한 모든 조합을 하나씩 검사하는 것입니다. 이 방법은 시간 복잡도가 O(n³)로 다소 높지만, 구현이 매우 간단하고 로직을 이해하기 쉽다는 장점이 있습니다.문제 해결 단계연결 리스트를 위한 노드(Node) 클래스를 정의합니다.테스트용 더
이 튜토리얼에서는 배열 안에서 세 원소의 합이 주어진 숫자와 일치하는 삼중항(triplet)을 찾는 프로그램을 작성하는 방법을 알아보겠습니다.문제 해결 접근 방식가장 기본적인 방법은 브루트 포스(Brute Force) 탐색입니다. 세 개의 중첩 반복문을 사용하여 배열의 모든 세 원소 조합을 확인하는 방식입니다. 단계별로 살펴보겠습니다.테스트용 더미 데이터로 배열을 생성합니다.세 원소를 가리키기 위해 세 개의 중첩 반복문을 작성하고, 각 반복문은 배열 끝까지 순회합니다.세 원소의 합을 계산합니다.계산된 합을 주어진 목표 값과 비교합니
이 튜토리얼에서는 주어진 숫자와 XOR 연산을 수행했을 때 결과가 최대가 되는 숫자를 찾는 프로그램을 작성해 보겠습니다.XOR 연산의 기본 원리이 문제에서는 비트 수를 8비트로 가정합니다.XOR(배타적 논리합) 연산은 다음과 같은 특징을 가집니다.서로 다른 비트끼리 XOR 연산을 하면 결과가 1이 됩니다.같은 비트끼리 XOR 연산을 하면 결과가 0이 됩니다.따라서 주어진 숫자의 모든 비트를 뒤집으면, 즉 1의 보수(1s complement)를 구하면 그 값이 바로 우리가 찾고자 하는 숫자입니다. 모든 비트가 서로 달라지기 때문에 X
이 튜토리얼에서는 배열 내 세 개의 요소(삼중항)를 골라 그 합이 0이 되는 모든 조합을 찾아 출력하는 프로그램을 C++로 작성해 보겠습니다.가장 기본적인 방법인 브루트 포스(Brute Force) 접근법을 사용하며, 문제 해결 과정은 다음과 같습니다.문제 해결 단계테스트용 더미 데이터로 배열을 생성합니다.세 개의 요소를 탐색하기 위해 중첩된 세 개의 반복문을 작성하고, 각 반복문은 배열 끝까지 순회합니다.선택한 세 요소의 합을 계산합니다.계산된 합이 0과 같은지 비교합니다.합이 0이라면 해당 세 요소를 출력하고, 삼중항을 찾았음을
이 튜토리얼에서는 자연수의 모든 약수를 찾는 프로그램을 작성해 보겠습니다. 비교적 간단한 문제이므로, 해결 과정을 단계별로 차근차근 살펴보겠습니다.문제 해결 접근 방식약수를 구할 자연수를 초기화합니다.1부터 해당 숫자까지 반복하는 루프를 작성합니다.현재 숫자로 주어진 숫자를 나누었을 때 나머지가 0인지, 즉 나누어떨어지는지 확인합니다.나누어떨어진다면 그 숫자는 약수이므로 출력합니다.예제 코드그럼 바로 코드를 살펴보겠습니다.#include <bits/stdc++.h> using namespace std; void findD
이번 튜토리얼에서는 자연수의 모든 약수를 찾는 프로그램을 C++로 작성해 보겠습니다. 단순히 1부터 n까지 모두 나누어 확인하는 대신, 제곱근(√n)까지만 반복하는 효율적인 방법을 사용하면 시간 복잡도를 O(n)에서 O(√n)으로 크게 줄일 수 있습니다.해결 접근 방식약수는 항상 쌍(pair)으로 존재한다는 점이 핵심입니다. 예를 들어 n = 65라면, 5가 약수이면 65 ÷ 5 = 13 역시 약수입니다. 따라서 다음과 같은 순서로 문제를 해결할 수 있습니다.자연수 n을 초기화합니다.1부터 n의 제곱근까지 반복하는 루프를 작성합니다
개요이 튜토리얼에서는 이진 탐색 트리(Binary Search Tree, BST)에서 합이 주어진 숫자와 같아지는 모든 쌍(pair)을 찾는 프로그램을 작성해 보겠습니다.핵심 아이디어는 트리의 노드 값을 두 개의 별도 리스트(왼쪽 경로와 오른쪽 경로)에 저장한 뒤, 정렬된 배열에서 두 포인터를 사용하는 것처럼 양 끝에서부터 값을 비교해 나가는 것입니다. 그럼 문제 해결 단계를 하나씩 살펴보겠습니다.문제 해결 단계이진 트리를 위한 구조체(struct Node)를 생성합니다.이진 탐색 트리에 새 노드를 삽입하는 함수를 작성합니다.BST
이 튜토리얼에서는 다음과 같은 문제를 함께 해결해 보겠습니다.문제 정의N리터 용량의 물탱크가 있고, 펌프가 분당 S의 속도로 물을 채운다고 가정해 봅시다. 그런데 안타깝게도 탱크에 구멍이 뚫려 있어서, 물을 채우는 동안 분당 WS의 속도로 물이 새어 나갑니다.우리가 구해야 할 것은 바로 탱크를 가득 채울 때까지 낭비되는 물의 총량입니다.해결 접근 방식이 문제는 간단한 수학적 계산으로 해결할 수 있습니다.먼저, 분당 실제로 탱크에 채워지는 물의 양은 유입 속도(S)에서 유출 속도(WS)를 뺀 값과 같습니다.다음으로, 물탱크의 용량(N
개요이 튜토리얼에서는 주어진 배열에서 두 번 이상 등장하는 요소(반복 요소)를 찾는 C++ 프로그램을 작성해 보겠습니다. 각 요소의 등장 횟수를 저장하기 위해 map(맵) 자료구조를 활용하며, 가장 먼저 발견된 중복 요소를 반환하는 방식으로 문제를 해결합니다.문제 해결 접근 방법문제를 해결하는 과정은 다음과 같습니다.배열을 초기화합니다.배열에 포함된 각 요소의 빈도수를 저장할 카운터 맵을 선언합니다.배열을 순회하면서 각 요소가 이미 맵에 존재하는지 확인합니다.존재한다면 해당 요소의 빈도수를 1 증가시킵니다.존재하지 않는다면 새로운
생일 역설이란?생일 역설(Birthday Paradox)은 확률론 분야에서 가장 유명한 문제 중 하나입니다. 직관적으로는 같은 생일을 가진 사람이 등장하려면 많은 인원이 필요할 것 같지만, 실제로는 생각보다 훨씬 적은 인원만으로도 충분히 높은 확률이 나온다는 것이 이 문제의 흥미로운 점입니다.문제의 정의는 다음과 같습니다.생일 파티에 여러 명의 사람들이 모여 있고, 그중 일부는 같은 생일이 겹칩니다. 우리는 주어진 확률 조건을 만족하기 위해 필요한 대략적인 인원수를 구해야 합니다.확률 개념 이해하기확률의 기본 개념을 동전 던지기로
연결 리스트(Linked List)는 여러 개의 노드가 서로 연결되어 있는 선형 자료구조입니다. 각 노드는 두 가지 필드로 구성되는데, 하나는 실제 값을 저장하는 데이터 필드이고, 다른 하나는 다음 노드의 주소를 가리키는 포인터입니다. 단일 연결 리스트(singly linked list)가 주어졌을 때, 이 리스트에서 첫 번째 노드를 삭제해야 하는 상황을 가정해 보겠습니다. 예를 들면 다음과 같습니다. 입력 1 − 4 → 3 → 2 → 1 출력 − 3 → 2 → 1
문제 소개두 개의 문자열 a와 b가 주어졌을 때, 문자열 a를 시계 방향 또는 반시계 방향으로 정확히 두 자리 회전시켜 문자열 b를 얻을 수 있는지 확인하는 것이 이번 포스팅의 목표입니다. 먼저 예시를 통해 문제를 살펴보겠습니다.입력 예시 1a = google b = legoog출력 −True설명 − 문자열 google을 반시계 방향으로 두 자리 회전하면 legoog가 됩니다. 따라서 True를 반환합니다.입력 예시 2a = tuorialst b = tutorials출력 −False설명 − 문자열 tuorialst는 어떤 방향으로든
길이가 N인 문자열 str이 주어졌다고 가정해 봅시다. 이때 주어진 이진 문자열(Binary String)에서 1로 시작하고 1로 끝나는 부분 문자열의 개수를 세는 것이 목표입니다. 이진 문자열은 0과 1만으로 구성된 문자열을 의미합니다.입력 및 출력 예시예시 1N = 5 str = 11101출력: 6설명: 주어진 이진 문자열에는 1로 시작하고 1로 끝나는 부분 문자열이 총 6개 존재합니다. 해당 부분 문자열의 집합은 {11, 111, 1110, 11101, 1101, 101}입니다.예시 2N = 4 str = 0011출력: 1설명
문제 정의정렬되지 않은 두 배열 arr1[]과 arr2[]가 주어졌다고 가정해 봅시다. 우리가 해야 할 작업은 arr1[]의 각 요소에 대해, arr2[] 안에서 그 요소보다 작거나 같은 값이 몇 개 있는지 세는 것입니다. 단, 두 배열에는 중복된 값이 포함될 수 있다는 점을 유의해야 합니다.예제 입력N = 6 M = 9 arr1[N] = {1, 2, 5, 0, 6, 3} arr2[M] = {0, 0, 1, 2, 1, 3, 4, 6, 8}예제 출력4 5 7 2 8 6출력 결과를 살펴보면, arr1의 첫 번째 요소 1보다 작거나 같은