문제 설명0부터 N-1까지의 N개 원소로 이루어진 순열(permutation)이 주어집니다. 여기서 고정점(fixed point)이란 값이 해당 인덱스와 일치하는 위치, 즉 arr[i] = i를 만족하는 인덱스를 의미합니다.배열에서 최대 1번의 스왑(원소 교환)을 수행할 수 있을 때, 만들 수 있는 고정점의 최대 개수를 구하는 것이 이 문제의 목표입니다.예시입력 배열이 {0, 1, 2, 3, 4, 6, 5}라고 가정해 보겠습니다. 이때 정답은 7입니다.모든 원소를 고정점으로 만들기 위해서는 6과 5의 위치를 서로 교환해야 합니다.교
문제 소개 이 문제에서는 크기가 n인 배열과 숫자 M이 주어집니다. 우리가 작성해야 할 프로그램은 주어진 크기의 부분 배열(sub-array) 안에 있는 고유한 정수의 최대 개수를 찾는 것입니다. 다시 말해, 중복을 제외한 서로 다른 원소를 가장 많이 포함하고 있는 크기 M짜리 부분 배열을 찾아야 합니다. 예제를 통해 문제를 자세히 이해해 보겠습니다. 입력 − array = {4, 1, 2, 1, 4, 3}, M = 4 출력 − 4 설명 − 크기가 4인 모든 부분 배열의 조합: {4, 1, 2, 1} → 고유 원소 3개 {1, 2,
문제 개요양의 정수로 이루어진 두 개의 배열이 주어졌을 때, 각 배열에서 크기가 같은 부분 배열(sub-array)을 하나씩 선택하고, 두 부분 배열의 모든 원소에 비트 OR 연산을 적용해 그 합을 계산합니다. 목표는 이 OR 합이 최대가 되도록 부분 배열을 선택하는 것입니다.예시다음과 같은 입력이 주어졌다고 가정해 보겠습니다.arr1[] = {1, 2, 4, 3, 2} arr2[] = {1, 3, 3, 12, 2}이 경우 아래와 같이 두 부분 배열을 만들었을 때 최댓값을 얻을 수 있습니다.Subarr1[] = {2, 4, 3} S
이 문제에서는 각 노드가 값을 가지는 이진 트리(Binary Tree)가 주어지며, 트리 내 두 잎(leaf) 노드 사이의 경로 중 값의 합이 최대가 되는 경로를 찾는 프로그램을 작성해야 합니다.여기서 말하는 경로란 한 잎 노드에서 다른 잎 노드까지 이어지는 경로를 의미하며, 이 경로가 반드시 루트(root) 노드를 포함할 필요는 없습니다. 즉, 루트를 지나지 않는 경로라도 합이 더 크다면 그것이 정답이 될 수 있습니다.이진 트리란?이진 트리는 각 노드가 최대 두 개의 자식 노드를 가질 수 있는 트리 자료구조입니다. 이 두 자식 노
이 문제에서는 삼각형 형태로 배치된 숫자들이 주어지며, 이 삼각형 안에서 최대 경로 합(maximum path sum)을 찾는 프로그램을 작성하는 것이 목표입니다.삼각형의 요소들은 첫 번째 행에 1개의 요소가 배치되고, 그다음 행부터는 요소의 개수가 하나씩 증가하며 n번째 행까지 채워지는 구조입니다.프로그램은 삼각형 내에서 요소들의 합이 가장 커지는 경로를 찾아야 합니다. 즉, 꼭짓점에서 시작해 아래 행으로 이동하면서 만들 수 있는 경로 중 합이 최대가 되는 경로를 구하는 것입니다.문제 예시예제를 통해 문제를 살펴보겠습니다.입력 −
이 문제에서는 역삼각형 형태로 배치된 숫자들이 주어지며, 이 삼각형 안에서 만들 수 있는 최대 경로 합을 찾는 프로그램을 작성해야 합니다.문제 개요역삼각형 형태의 숫자 배열은 첫 번째 행에 n개의 요소가 있고, 두 번째 행에는 n-1개, 세 번째 행에는 n-2개가 있는 식으로 한 줄씩 줄어드는 구조입니다.우리의 목표는 각 행에서 하나의 요소씩 선택해 더할 때 얻을 수 있는 최대 합을 구하는 것입니다.입력 예시5 1 9 3 6 2출력 예시17설명마지막 행에서 맨 위 행까지 경로를 따라 올라가면서, 경로에 포함되는 요소들의 합이
이 튜토리얼에서는 주어진 문자열에서 길이가 k인 모든 부분 문자열을 추출하고, 이를 b진법의 수로 간주하여 10진수로 변환하는 프로그램을 C++로 구현하는 방법을 알아봅니다.문제의 조건은 다음과 같습니다. 길이가 일정한 하나의 문자열이 주어지며, 우리는 이 문자열에서 크기가 k인 부분 문자열들을 순서대로 가져온 뒤, 각 부분 문자열이 b진법으로 표현된 수라고 가정하고 이에 대응하는 10진수 값을 계산해야 합니다.동작 원리변환 과정은 다음과 같이 진행됩니다.1. 문자열의 시작 위치를 한 칸씩 이동하면서 길이 k의 부분 문자열을 추출합
이번 튜토리얼에서는 임의의 이진 트리를 자식 합 속성(children sum property)을 만족하는 이진 트리로 변환하는 프로그램을 C++로 구현해 보겠습니다.자식 합 속성이란?자식 합 속성이란 각 노드의 값이 왼쪽 자식과 오른쪽 자식의 값의 합과 같아야 한다는 규칙입니다. 즉, 모든 내부 노드에 대해 다음 조건이 성립해야 합니다.노드 값 = 왼쪽 자식 값 + 오른쪽 자식 값단, 이 문제에는 중요한 제약 조건이 있습니다.노드의 값은 증가만 할 수 있습니다.트리의 구조는 변경할 수 없습니다.기존 값을 감소시킬 수 없습니다.접근
이 튜토리얼에서는 C++를 사용하여 배열을 순환 이중 연결 리스트(Circular Doubly Linked List)로 변환하는 방법을 알아보겠습니다.순환 이중 연결 리스트는 각 노드가 next와 prev 포인터를 모두 가지며, 마지막 노드의 다음 포인터가 다시 첫 번째 노드를 가리키고, 첫 번째 노드의 이전 포인터가 마지막 노드를 가리키는 자료구조입니다. 즉, 리스트 전체가 하나의 원을 이루는 형태입니다.변환 접근 방식주어진 배열의 각 요소를 순서대로 순회하면서 다음 과정을 수행합니다.새로운 노드를 생성하고 배열의 요소 값을 저장
개요이 글에서는 해싱(hash) 기법을 활용해 배열을 축소 형태(reduced form)로 변환하는 C++ 프로그램을 다룹니다.여기서 축소 형태란 주어진 배열의 모든 요소를 0부터 n-1 사이의 값으로 바꾸는 것을 의미합니다. 이때 각 요소는 원래 배열 안에서의 크기 순서(순위)를 그대로 유지합니다. 즉, 가장 작은 요소는 0, 두 번째로 작은 요소는 1로 변환되는 방식입니다.접근 방법알고리즘의 동작 과정은 다음과 같습니다.원본 배열의 복사본을 만든 뒤 오름차순으로 정렬합니다.정렬된 배열을 순회하면서 각 요소를 키(key)로, 0부
이번 글에서는 C++에서 pair(쌍)의 벡터를 활용해 주어진 배열을 축소된 형태(reduced form)로 변환하는 프로그램을 단계별로 알아보겠습니다.문제 정의하나의 배열이 주어졌을 때, 이 배열을 0부터 n-1 사이의 값만 포함하도록 변환하는 것이 목표입니다. 여기서 말하는 축소된 형태란 배열의 각 요소를 원래 값 대신 상대적인 크기 순위로 바꾼 결과를 뜻합니다. 가장 작은 값은 0, 두 번째로 작은 값은 1과 같은 식으로 매핑됩니다.알고리즘 동작 원리전체 구현은 세 단계로 이루어집니다.pair 생성: 각 배열 요소를 값 + 원
이번 튜토리얼에서는 C++를 사용해 배열을 지그재그(zig-zag) 형태로 변환하는 프로그램을 살펴보겠습니다. 이 문제에서는 중복 없이 서로 다른 원소들로 구성된 배열이 하나 주어집니다. 우리가 해야 할 작업은 배열의 원소들을 재배열하여, 인접한 두 원소 사이의 크기 관계가 번갈아 나타나도록 만드는 것입니다. 즉, 첫 번째 원소는 두 번째 원소보다 작고, 두 번째 원소는 세 번째 원소보다 커야 하는 식으로 비교가 교대로 성립하는 패턴을 완성해야 합니다. 예를 들어 입력 배열이 {4, 3, 7, 8, 6, 2, 1}이라면, 변환 후
개요이 튜토리얼에서는 C++를 사용하여 이진 탐색 트리(BST, Binary Search Tree)를 최대 힙(Max Heap)으로 변환하는 프로그램을 구현해 보겠습니다.목표는 주어진 이진 탐색 트리의 노드 구조를 그대로 유지한 채, 각 노드의 값이 자식 노드의 값보다 크거나 같아지도록(즉, 최대 힙의 조건을 만족하도록) 데이터만 재배치하는 것입니다. 변환 후에는 어떤 노드든 자신의 모든 자손 노드보다 크거나 같은 값을 가져야 합니다.접근 방법가장 효율적인 해결 방법은 두 가지 트리 순회 기법을 조합하는 것입니다.중위 순회(Inor
이 글에서는 C++를 사용하여 이진 탐색 트리(Binary Search Tree, BST)를 최소 힙(min heap)으로 변환하는 프로그램을 다룹니다.이진 탐색 트리가 하나 주어졌을 때, 목표는 해당 트리를 최소 힙으로 변환하는 것입니다. 단, 변환된 트리도 원본과 동일한 원소 집합을 가져야 하며, 원소들을 비교할 때 이진 탐색 트리의 정렬 조건이 그대로 유지되어야 합니다. 즉, 결과 트리를 중위 순회(inorder traversal)하면 여전히 오름차순으로 정렬된 값이 출력되어야 합니다.문제 해결 접근 방식이 문제는 두 단계의
이번 튜토리얼에서는 십진 소수(decimal fraction)를 이진수(binary number)로 변환하는 C++ 프로그램을 살펴보겠습니다.프로그램에는 하나의 십진 소수와 정수 k가 입력으로 주어집니다. 우리의 목표는 주어진 십진 소수를 소수점 이하 k자리의 정밀도까지 이진수로 변환하는 것입니다.변환 알고리즘의 핵심 원리1. 정수부 변환정수부를 2로 계속 나누면서 나머지를 차례대로 기록한 후, 문자열을 뒤집으면 해당 정수의 이진 표현이 완성됩니다.2. 소수부 변환소수부에 2를 곱한 뒤 그 정수 부분을 확인합니다. 정수부가 1이면
이 튜토리얼에서는 C 스타일의 C++ 코드를 사용하여 임의의 진법의 수를 10진수로 변환하는 방법과, 그 반대로 10진수를 원하는 진법으로 변환하는 방법을 예제와 함께 살펴봅니다.진법 변환은 2진수, 8진수, 16진수 등 다양한 진법의 수를 다룰 때 반드시 이해해야 하는 기본 개념입니다. 여기서는 정수와 그 수의 진법이 주어졌을 때 해당 수의 10진수 등가값을 구하는 프로그램을 작성하고, 이어서 그 역연산도 함께 구현해 보겠습니다.1. 임의의 진법 → 10진수 변환진법 변환의 원리는 간단합니다. 문자열의 각 자릿값을 구한 뒤, 가장
이번 튜토리얼에서는 요소를 딱 하나만 추가하여 주어진 배열을 등차수열(Arithmetic Progression, AP)로 변환하는 프로그램을 C++ 코드와 함께 살펴보겠습니다.문제 개요정수 배열이 하나 주어집니다. 우리의 과제는 이 배열에 단 하나의 요소를 추가하여 배열 전체가 등차수열을 이루도록 만들고, 그때 추가한 값을 반환하는 것입니다. 만약 어떤 방식으로도 등차수열을 만들 수 없다면 -1을 반환해야 합니다.접근 방법이 문제는 다음과 같은 논리로 해결할 수 있습니다.배열을 먼저 오름차순으로 정렬합니다.첫 두 요소의 차이를 공차
이 튜토리얼에서는 주어진 문자열을 고유한(distinct) 문자만 포함하도록 변환하는 C++ 프로그램을 살펴보겠습니다.문제의 요구 사항은 다음과 같습니다. 하나의 문자열이 주어지며, 우리는 문자열을 처음부터 끝까지 순회하면서 중복해서 등장하는 모든 문자를 찾아낸 뒤, 아직 문자열에 존재하지 않는 다른 알파벳으로 교체해야 합니다. 최종 결과물의 모든 문자는 서로 달라야 합니다.알고리즘 접근 방식핵심 아이디어는 비교적 간단합니다.먼저 문자열의 길이가 26을 초과하는지 확인합니다. 영어 소문자는 총 26개뿐이므로, 길이가 26보다 크면
n개의 요소로 구성된 배열이 있다고 가정해 보겠습니다. 일부 요소는 두 번 나타나고, 어떤 요소는 한 번만 나타납니다. 모든 요소는 1 ≤ A[i] ≤ n 범위 안에 있습니다. 우리가 찾아야 할 것은 바로 이 배열에 존재하지 않는 숫자들입니다. 단, 추가 공간을 사용하지 않고 O(n) 시간 안에 문제를 해결해야 한다는 제약 조건이 있습니다.예를 들어 배열이 [4, 3, 2, 7, 8, 2, 3, 1]이라면 결과는 [5, 6]이 됩니다.해결 접근 방법이 문제는 인덱스 마킹(index marking) 기법을 활용하면 효율적으로 해결할
문제 소개 비어 있지 않은 문자열이 하나 주어집니다. 이때 해당 문자열을 자기 자신의 부분 문자열 하나를 골라 여러 번 이어 붙여서 만들 수 있는지 확인해야 합니다. 문자열은 소문자 영어 알파벳으로만 구성되며, 길이는 10,000을 넘지 않는다고 가정합니다. 예를 들어 입력이 "abaabaaba"라면 정답은 true입니다. 이 문자열은 "aba"를 세 번 반복하여 만들 수 있기 때문입니다. 풀이 접근 방식 이 문제는 KMP 알고리즘에 사용되는 실패 함수, 즉 LPS(Longest Proper Pr