문제 개요이 튜토리얼에서는 n개의 원이 가질 수 있는 최대 교점 개수를 구하는 프로그램을 다룹니다.원의 개수 n이 주어졌을 때, 이 원들이 서로 만들 수 있는 최대 교점의 수를 계산하는 것이 목표입니다.접근 방법두 원은 최대 2개의 교점을 가질 수 있습니다. 따라서 n개의 원에서 가능한 모든 원의 쌍(pair)마다 최대 2개씩의 교점이 발생합니다.n개의 원으로 만들 수 있는 쌍의 개수는 조합 공식 C(n, 2) = n(n-1)/2이므로, 최대 교점의 수는 다음과 같이 계산됩니다.최대 교점 수 = 2 × C(n, 2) = n × (n
이 튜토리얼에서는 n개의 직선이 만들 수 있는 최대 교차점 개수를 구하는 프로그램을 살펴보겠습니다.직선의 개수 n이 주어졌을 때, 이 직선들이 형성할 수 있는 최대 교차점의 개수를 계산하는 것이 목표입니다.접근 방식과 핵심 원리교차점의 개수가 최대가 되려면 다음 조건을 만족해야 합니다.- 어떤 두 직선도 서로 평행하지 않아야 합니다.- 세 개 이상의 직선이 한 점에서 동시에 만나서는 안 됩니다.위 조건이 충족되면 모든 직선 쌍이 서로 다른 점에서 정확히 한 번씩 교차하므로, 가능한 모든 직선 쌍의 개수가 곧 최대 교차점 개수가 됩니
이 튜토리얼에서는 배열의 두 부분 집합 사이의 최대 차이를 구하는 프로그램을 작성하는 방법을 살펴보겠습니다. 문제 정의 임의의 정수들이 하나 또는 두 개씩 포함된 배열이 주어집니다. 우리의 과제는 이 배열을 두 개의 부분 집합으로 나누어 다음 조건을 만족시키는 것입니다. 두 부분 집합의 합의 차이가 최대가 되어야 합니다.어떤 부분 집합에도 중복된 숫자가 포함되어서는 안 됩니다. 접근 방법 이 문제는 다음과 같은 단계로 해결할 수 있습니다. 배열을 순회하며 각 요소가 배열의 다른 위치에도 등장하는지(중복 여부) 확인합니다.중복되는 요
이 튜토리얼에서는 선분들의 중심을 이동시켜 얻을 수 있는 최대 교차 영역을 구하는 프로그램을 다룹니다.문제 조건은 다음과 같습니다. 길이가 모두 같은 세 선분의 중심 좌표와 선분의 길이 L, 그리고 각 중심을 이동할 수 있는 최대 거리 K가 주어집니다. 목표는 각 중심을 최대 K만큼씩 이동시켜 세 선분이 동시에 겹치는 구간, 즉 공통 교차 영역의 길이를 최대화하는 것입니다.알고리즘 접근 방식핵심 아이디어는 세 중심 좌표를 먼저 오름차순으로 정렬한 뒤, 가장 바깥쪽에 있는 두 중심 사이의 거리(center[2] − center[0])
이 튜토리얼에서는 배열에서 정확히 K개의 원소를 삭제한 후 남은 배열의 중간 원소가 가질 수 있는 최댓값을 구하는 방법을 다룹니다.문제의 조건은 다음과 같습니다. 크기가 N인 배열과 정수 K가 주어지며, 우리는 배열에서 K개의 원소를 제거하여 결과 배열의 중간 원소가 최대한 커지도록 만들어야 합니다.접근 방법K개의 원소를 삭제하면 남는 배열의 크기는 n - k가 됩니다. 이때 중간 원소의 위치(1-based 인덱스)는 (n - k + 1) / 2입니다.핵심 아이디어는 삭제되는 K개의 원소를 어느 쪽에 배치할지 자유롭게 선택할 수 있
문제 소개 이 글에서는 주어진 연산들을 수행한 후 배열에서 얻을 수 있는 최대 곱을 찾는 프로그램을 다룹니다. 크기가 N인 배열이 주어지며, 우리는 정확히 N-1번의 연산을 수행해야 합니다. 사용할 수 있는 연산은 다음 두 가지입니다. 연산 1: a[j]를 a[i] × a[j]로 바꾸고, a[i]를 배열에서 제거 연산 2: a[i]를 그대로 제거 (단, 전체 과정에서 한 번만 사용 가능) 목표는 이 연산들을 적절히 조합하여 마지막에 남는 값이 최대가 되도록 만드는 것입니다. 접근 방법 최대 곱을 얻으려면 배열 원소의 부호에 따
이 튜토리얼에서는 한 배열의 윈도우(연속된 구간) 합이 최대가 되도록 하면서, 동일한 범위의 다른 배열 윈도우에 포함된 요소들이 모두 고유(중복 없음)하도록 만드는 프로그램을 다룹니다.문제에서는 서로 같은 개수의 요소를 가진 두 개의 배열이 주어집니다. 우리의 목표는 한 배열에서 요소들의 합이 최대가 되는 윈도우를 찾되, 그 윈도우와 같은 범위에 있는 다른 배열의 요소들은 중복이 없어야 한다는 조건을 만족시키는 것입니다.접근 방법이 문제는 슬라이딩 윈도우(Sliding Window) 기법과 해시 셋(unordered_set)을 활용
이 글에서는 주어진 네 개의 숫자로 만들 수 있는 최대 시간을 구하는 프로그램을 C++로 작성하는 방법을 소개합니다. 네 개의 숫자로 이루어진 배열이 주어졌을 때, 이 숫자들을 모두 정확히 한 번씩 사용하여 24시간 형식(HH:MM)으로 나타낼 수 있는 가장 늦은 시간을 찾는 것이 목표입니다. 만약 유효한 시간을 만드는 것이 불가능하다면 -1을 반환해야 합니다. 문제 접근 방법 가장 효율적인 해결책은 그리디(Greedy) 기법과 빈도 맵(Frequency Map)을 함께 활용하는 것입니다. 시간의 각 자리에 올 수 있는 최댓값부터
이 튜토리얼에서는 문자열의 끝에 도달하기 위해 필요한 최대 점프 거리(점프 파워)를 구하는 프로그램을 C++로 작성하는 방법을 알아보겠습니다.문제 이해하기문제에서는 0과 1로만 이루어진 문자열이 주어집니다. 우리가 해야 할 일은 문자열의 앞에서 끝까지 이동할 때 필요한 최대 점프 거리를 계산하는 것입니다.여기서 중요한 규칙은 다음과 같습니다. 현재 위치의 문자와 같은 문자가 있는 위치로만 점프하여 이동할 수 있습니다. 즉, 마지막 문자와 동일한 문자 사이의 간격 중 가장 큰 값이 곧 최대 점프 거리가 됩니다.알고리즘 접근 방식해결
이 튜토리얼에서는 최대 곱 로프 자르기(Maximum Product Cutting, DP-36) 문제를 해결하는 방법을 다룹니다.N미터 길이의 로프가 주어졌을 때, 로프를 여러 개의 정수 길이 조각으로 잘라 각 조각 길이의 곱이 최대가 되도록 만드는 것이 목표입니다. 예를 들어 길이가 10인 로프는 3, 3, 4로 자를 경우 곱이 36으로 가장 커집니다.예제 코드#include <iostream> using namespace std; // 두 개, 세 개 정수 중 최댓값 구하기 int max(int a, int b) {
이 튜토리얼에서는 배열에 포함된 요소들의 곱 중 최댓값을 구하는 프로그램을 C++로 작성해 보겠습니다. 여기서 중요한 조건은, 곱에 사용된 모든 반복 요소의 빈도 합이 2 × k보다 작거나 같아야 한다는 점입니다. 즉, 하나의 배열과 정수 k가 주어졌을 때, 각 숫자의 등장 횟수(빈도)의 총합이 2 × k 이하가 되도록 요소를 선택하면서 얻을 수 있는 최대 곱을 찾아야 합니다. 접근 방법 이 문제는 정렬과 해시 맵(unordered_map)을 활용하면 효율적으로 해결할 수 있습니다. 전체적인 흐름은 다음과 같습니다. 정렬: 배열을
이 글에서는 C++를 이용해 정방행렬(N×N)에서 인접한 네 개 요소의 곱이 가장 커지는 경우를 찾는 방법을 알아봅니다.여기서 말하는 인접한 네 개 요소란 행렬에서 서로 이어진 네 칸을 의미하며, 가로(왼쪽·오른쪽), 세로(위·아래), 대각선 어느 방향이든 가능합니다.문제 접근 방식가장 단순하면서도 확실한 방법은 완전 탐색(Brute Force)입니다. 행렬의 모든 칸을 순회하면서, 각 칸을 기준으로 다음 네 방향의 곱을 차례로 계산합니다.가로 방향: 같은 행에서 왼쪽으로 연속된 세 칸과의 곱세로 방향: 같은 열에서 위쪽으로 연속된
이 튜토리얼에서는 정수 배열이 주어졌을 때, 그 배열에서 서로 다른 세 개의 원소(크기 3의 부분 수열)를 선택하여 만들 수 있는 최대 곱을 구하는 방법을 다룹니다.예를 들어 배열이 {10, 3, 5, 6, 20}이라면, 세 원소 10, 6, 20을 곱한 1200이 최대 곱이 됩니다.접근 방법: 완전 탐색(Brute Force)가장 직관적인 방법은 배열에서 가능한 모든 세 원소 조합을 확인하는 것입니다. 세 개의 중첩 반복문을 사용해 인덱스 i < j < k를 순회하며 각 조합의 곱을 계산하고, 그중 최댓값을 저장하면 됩
이 튜토리얼에서는 크기가 3인 증가하는 부분 수열의 최대 곱을 구하는 프로그램을 살펴보겠습니다. 양의 정수로 이루어진 배열이 주어졌을 때, 세 개의 원소를 인덱스 순서대로 선택하여 값이 점점 커지는(증가하는) 부분 수열을 만들고, 그중 곱이 가장 큰 조합을 찾는 것이 목표입니다. 문제 이해하기 예를 들어 배열이 [10, 11, 9, 5, 6, 1, 20]이라면, 가능한 증가 부분 수열 중 곱이 가장 큰 것은 10, 11, 20입니다. 이 세 값의 곱은 10 × 11 × 20 = 2200이 됩니다. 접근 방법 모든 세 원소 조합을
문제 소개 이 글에서는 정수 배열이 주어졌을 때 증가하는 부분 수열(increasing subsequence)의 원소들을 곱하여 얻을 수 있는 최댓값을 구하는 프로그램을 C++로 작성해 보겠습니다. 여기서 부분 수열(subsequence)이란 배열에서 원소들의 상대적인 순서를 유지한 채 일부 원소를 선택한 것을 의미합니다. 단, 선택된 원소들은 반드시 왼쪽에서 오른쪽으로 값이 커져야 하며, 부분 수열의 길이에는 제한이 없습니다. 예시로 이해하기 배열이 {3, 100, 4, 5, 150, 6}라고 가정해 봅시다. 이 배열에서 만들
문제 개요 이 글에서는 정수 배열이 주어졌을 때, 왼쪽과 오른쪽에 있는 다음 큰 요소(next greater element)의 인덱스 곱 중 최댓값을 구하는 프로그램을 C++로 작성하는 방법을 알아보겠습니다. 각 요소 i에 대해 다음 두 값을 정의합니다. L(i): 현재 요소보다 크면서 왼쪽에서 가장 가까운 요소의 인덱스 (인덱스는 1부터 시작) R(i): 현재 요소보다 크면서 오른쪽에서 가장 가까운 요소의 인덱스 목표는 모든 요소에 대해 L(i) × R(i)를 계산한 뒤 그중 최댓값을 찾는 것입니다. 만약 어느 쪽에도 더 큰
이 튜토리얼에서는 N개의 배열에서 증가하는 순서 요소들의 최대 합을 찾는 프로그램을 다룹니다.크기가 M인 N개의 배열이 주어졌을 때, 각 배열에서 하나의 요소를 선택해 합을 구하되, 앞선 배열에서 선택한 요소가 뒤따르는 배열에서 선택한 요소보다 반드시 작아야 한다는 조건이 있습니다. 이 조건을 만족하면서 얻을 수 있는 최대 합을 구하는 것이 목표입니다.접근 방법이 문제는 그리디(Greedy) 기법으로 효율적으로 해결할 수 있습니다.모든 배열을 오름차순으로 정렬합니다.마지막 배열의 최댓값을 합계의 시작점으로 설정합니다.바로 앞 배열의
이 튜토리얼에서는 동적 프로그래밍(Dynamic Programming)을 활용하여 이진 트리에서 서로 인접하지 않는 노드들의 최대 합을 구하는 프로그램을 다룹니다. 문제 개요 이진 트리가 주어졌을 때, 목표는 부모-자식 관계로 직접 연결된 두 노드를 동시에 선택하지 않는다는 조건 하에서 노드 값의 합이 최대가 되는 부분 집합을 찾는 것입니다. 동적 프로그래밍 접근 방법 핵심 아이디어는 각 노드에 대해 두 가지 상태를 정의하는 것입니다. dp1[node]: 해당 노드를 선택하는 경우 얻을 수 있는 최대 합 dp2[node]: 해당
이번 튜토리얼에서는 서로 인접한(직접 연결된) 두 노드를 동시에 선택할 수 없다는 조건 아래에서 이진 트리 노드 값의 합이 최대가 되는 부분집합을 찾는 알고리즘을 다룹니다. 문제 정의 하나의 이진 트리가 주어졌을 때, 부모-자식 관계처럼 직접 연결된 두 노드를 부분집합에 함께 포함할 수 없다는 제약 조건을 만족하면서 노드 값의 총합이 최대가 되도록 하는 것이 목표입니다. 이 문제는 트리 구조에서의 대표적인 동적 계획법(Dynamic Programming) 응용 사례로 자주 등장합니다. 접근 방식 각 노드를 기준으로 다음 두 가
이 글에서는 C++를 활용해 특정 차이 조건을 만족하는 쌍(pair)의 최대 합을 구하는 프로그램을 작성하는 방법을 알아보겠습니다. 문제 정의 정수로 이루어진 배열 하나와 값 K가 주어집니다. 이때 두 원소의 차이가 K 미만일 때만 해당 원소들을 하나의 쌍으로 묶을 수 있으며, 서로 겹치지 않는(disjoint) 쌍들을 구성해 그 원소들의 합이 최대가 되도록 만들어야 합니다. 예를 들어 배열이 {3, 5, 10, 15, 17, 12, 9}이고 K가 4라고 가정해 보겠습니다. 이 경우 최적의 쌍은 (3, 5), (10, 12), (