N-ary(다진) 트리가 주어졌을 때, 이 트리를 순회할 수 있는 모든 방법의 수를 구하는 문제입니다. 아래 예시 트리를 살펴보겠습니다.위 트리에 대한 정답은 192가 됩니다.이 문제를 해결하려면 조합론(combinatorics)에 대한 기본적인 지식이 필요합니다. 핵심 아이디어는 각 노드의 자식들에 대해 가능한 모든 순열 조합을 곱해 나가는 것입니다.문제 해결 접근 방식이 접근법에서는 레벨 순서 순회(level order traversal)를 수행하면서 각 노드가 가진 자식의 개수를 확인하고, 그 개수의 팩토리얼(factorial
문제 정의배열과 여러 개의 쿼리가 주어졌을 때, 각 쿼리마다 범위 (L, R)가 주어집니다. 이때 범위 내의 모든 원소와 x를 XOR한 값의 합이 최대가 되도록 하는 숫자 x를 찾는 것이 목표입니다. 예를 들어 다음과 같습니다.입력 : A = {20, 11, 18, 2, 13} 세 개의 쿼리 (L, R) 쌍 1 3 3 5 2 4 출력 : 2147483629 2147483645 2147483645이 문제의 핵심 아이디어는 비트별 누적합(prefix count)입니다. 각 비트 위치(0~31)마다 배열의 앞부분부터 1이 등장한 횟수를
문제 개요주어진 배열과 목표 값 k가 있을 때, 배열의 모든 요소를 차례대로 XOR한 결과에 어떤 숫자 X를 추가로 XOR하면 그 최종 결과가 정확히 k가 되도록 하는 숫자 X를 찾는 것이 이번 튜토리얼의 목표입니다.먼저 예시를 통해 문제를 살펴보겠습니다.입력: arr[] = {1, 2, 3, 4, 5}, k = 10출력: 11설명: 1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 11 = 10입력: arr[] = {12, 23, 34, 56, 78}, k = 6출력: 73이 문제를 해결하는 열쇠는 XOR 연산자가 가진 독특한 성질입니다. 바로
디지털 루트란 무엇일까요?어떤 수의 각 자릿수를 모두 더했을 때 그 합이 한 자리 수가 된다면, 이 값을 해당 수의 디지털 루트(Digital Root)라고 합니다. 예를 들어 25의 자릿수 합은 2+5=7이므로, 25의 디지털 루트는 7입니다.이번 글에서 다룰 문제는 다음과 같습니다. 범위 [l, r]와 한 자리 정수 X가 주어졌을 때, 이 범위 안에서 디지털 루트가 X와 같은 수가 몇 개 있는지 구하는 것입니다.입력: l = 13, r = 25, X = 4출력: 2설명: 범위 (13, 25)에서 자릿수 합이 4인 수는 13과 2
배열이 주어졌을 때, 최소 하나의 비어 있지 않은 부분 배열(하위 배열)의 비트 AND 연산 결과가 될 수 있는 모든 정수를 찾는 문제를 해결해 보겠습니다. 예시는 다음과 같습니다.입력 : nums[ ] = { 3, 5, 1, 2, 8 }출력 : { 2, 5, 0, 3, 8, 1 }설명:2는 부분 배열 {2}의 비트 AND 값입니다.5는 부분 배열 {5}의 비트 AND 값입니다.0은 부분 배열 {1, 2}, {2, 8}, {1, 2, 8}의 비트 AND 값입니다.3은 부분 배열 {3}의 비트 AND 값입니다.8은 부분 배열 {8}의
문제 개요서로 다른 원소들로 구성된 배열이 주어졌을 때, 모든 쌍이 서로 나누어 떨어지는 부분 집합, 즉 큰 원소가 항상 작은 원소로 나누어 떨어지는 가장 큰 부분 집합을 찾는 것이 이번 문제의 목표입니다.입력 : arr[] = {10, 5, 3, 15, 20}출력 : 3설명: 가장 큰 부분 집합은 10, 5, 20입니다.10은 5로 나누어 떨어지고, 20은 10으로 나누어 떨어집니다.입력 : arr[] = {18, 1, 3, 6, 13, 17}출력 : 4설명: 가장 큰 부분 집합은 18, 1, 3, 6입니다.부분 수열에서 3은 1
문제 개요 이 튜토리얼에서는 서로 다른 양의 정수로 이루어진 배열이 주어졌을 때, 부분 집합 내의 모든 쌍에 대해 큰 수가 작은 수로 나누어 떨어지는 가장 큰 부분 집합을 찾는 문제를 다룹니다. 예를 들면 다음과 같습니다. 입력: nums[ ] = { 1, 4, 2, 6, 7} 출력: 1 2 4 설명: 조건을 만족하는 부분 집합은 (1, 2, 4), (1, 2, 6), (1, 7) 등이 있습니다. 길이가 3인 부분 집합은 2개이며, 각각 모든 쌍이 조건을 충족합니다. 입력: nums[ ] = { 1, 2, 3, 6 } 출력: 6
문제 소개 이진 트리가 하나 주어집니다. 트리에는 0과 1만 포함되어 있으며, 우리의 목표는 1과 0의 개수가 동일한 가장 큰 서브트리(하위 트리)를 찾는 것입니다. 해결 접근 방식 이 문제의 핵심 아이디어는 간단합니다. 먼저 값이 0인 모든 노드를 -1로 변환합니다. 그러면 문제가 합이 0인 가장 큰 서브트리 찾기로 단순화됩니다. 1과 -1의 합이 0이라는 것은 곧 원래 트리에서 1과 0의 개수가 같다는 의미이기 때문입니다. 알고리즘의 전체 흐름은 다음과 같습니다. 값 변환 및 합 계산(calc_sum): 트리를 후위 순회하며
이 글에서는 주어진 배열에서 모든 쌍의 합이 소수(prime number)가 되도록 만들 수 있는 가장 큰 부분집합을 찾는 방법을 다룹니다. 배열 원소의 최댓값은 100000이라고 가정합니다.문제 예시입력: nums[ ] = { 3, 2, 1, 1 } 출력: size = 3, subset = { 2, 1, 1 } 설명: 만들 수 있는 부분집합은 {3, 2}, {2, 1}, {2, 1, 1}입니다. {2, 1, 1}에서 쌍 (2, 1)의 합은 3으로 소수이고, 쌍 (1, 1)의 합은 2 역시 소수입니다. 입력: nums[ ] = {
이진 트리가 하나 주어져 있고, 여기서 리프 노드(자식이 없는 노드)들을 서로 쌍으로 교환하는 것이 우리의 과제입니다. 예를 들어 다음과 같습니다. 입력 − 출력 − 이 문제는 두 개의 포인터를 유지하면서 인접한 두 리프 노드를 차례로 가리키게 하고, 해당 노드들의 값을 서로 교환하는 방식으로 해결할 수 있습니다. 문제 해결 접근 방법 이 접근 방식에서는 트리를 순회하면서 리프 노드를 찾고, 지금까지 발견한 리프 노드의 개수를 세는 카운터를 함께 관리합니다. 핵심 아이디어는 다음과 같습니다. 카운터가 홀수일 때 : 현재 발견한
연결 리스트(Linked List)에 있는 노드들을 두 개씩 짝지어 서로 교환한 뒤 결과를 출력하는 문제를 해결해 보겠습니다. 먼저 예시를 통해 문제를 살펴보겠습니다.입력 : 1->2->3->4->5->6->NULL출력 : 2->1->4->3->6->5->NULL입력 : 1->2->3->4->5->NULL출력 : 2->1->4->3->5->NULL입력 : 1->NULL출력 : 1->NULL위 예시에서 볼
0부터 진법 B까지의 모든 숫자를 포함하는 수를 해당 진법의 판디지털(Pandigital) 숫자라고 합니다. 다만 일부 숫자는 1부터 9까지만 포함하는데, 이러한 수는 무영 판디지털(zeroless pandigital) 숫자라고 부릅니다. 판디지털 숫자의 대표적인 예로는 0123456789, 0789564312 등이 있습니다.이 튜토리얼에서는 하나의 숫자와 진법이 주어졌을 때, 해당 숫자가 주어진 진법에서 판디지털인지 확인하는 문제를 다룹니다.입력: num = 9651723467380AZ, base = 10 출력: YES 설명: n
이 튜토리얼에서는 연결 리스트(Linked List)가 주어졌을 때, x보다 작은 값들은 모두 리스트 앞쪽에 배치하고 나머지 값들은 뒤쪽에 배치하는 문제를 다룹니다. 중요한 조건은 각 요소의 원래 상대적 순서를 그대로 유지해야 한다는 점입니다.문제 예시입력 : 1->4->3->2->5->2->3, x = 3 출력 : 1->2->2->3->3->4->5 입력 : 1->4->2->10 x = 3 출력 : 1->2->4->10 입력 : 1
문제 소개이 문제에서는 숫자로 해석할 수 있는 문자열이 하나 주어집니다. 우리가 해야 할 일은 이 문자열을 두 부분으로 나누는 것입니다. 단, 첫 번째 부분은 정수 A로 나누어 떨어져야 하고, 두 번째 부분은 정수 B로 나누어 떨어져야 합니다.예를 들어 다음과 같습니다.입력 : str = 123, a = 12, b = 3 출력 : YES 12 3 12는 a(12)로 나누어 떨어지고, 3은 b(3)로 나누어 떨어집니다. 입력 : str = 1200, a = 4, b = 3 출력 : YES 12 00 입력 : str = 125, a
이진 트리가 주어졌을 때 굽힘(bend)의 개수가 가장 많은 경로를 찾아 그 길이를 출력하는 문제를 함께 해결해 보겠습니다. 여기서 굽힘이란 경로의 진행 방향이 왼쪽에서 오른쪽으로, 또는 오른쪽에서 왼쪽으로 바뀌는 지점을 의미합니다. 문제 예시 입력 − 출력 − 6 이 접근 방식에서는 트리를 순회하면서 직전 이동 방향을 계속 추적합니다. 방향이 바뀌는 순간마다 굽힘 카운트를 갱신하고, 모든 경로를 탐색한 뒤 그중 최댓값을 구합니다. 문제 해결 접근 방법 트리의 모든 경로를 하나씩 순회하면서 각 경로에서 발생한 굽힘의 개수를 세고
문제 개요 이 문제에서는 2차원 행렬이 주어지며, 그중 최대 평균값을 가지는 경로를 찾아야 합니다. 경로의 시작점은 가장 왼쪽 위 셀이고, 도착점은 가장 오른쪽 아래 셀입니다. 예를 들어 다음과 같습니다. 입력 : Matrix = [1, 2, 3 4, 5, 6 7, 8, 9] 출력 : 5.8 최대 평균 경로 : 1 -> 4 -> 7 -> 8 -> 9 경로의 합은 29이고, 평균은 29/5 = 5.8 이 문제에서는 오른쪽 또는 아래 방향으로만 이동할 수 있
펜타토프 수(Pentatope Number)는 파스칼의 삼각형에서 다섯 번째 열(대각선)에 해당하는 수를 말합니다. 다섯 번째 수라는 것은 파스칼 삼각형에 최소한 다섯 개의 숫자가 필요하다는 의미이며, 따라서 이 수열의 첫 번째 항은 파스칼 삼각형 네 번째 행인 1 4 6 4 1부터 시작됩니다. 이번 튜토리얼에서는 n번째 펜타토프 수를 구하는 프로그램을 만들어 보겠습니다. 입력 : 1 출력 : 1 입력 : 4 출력 : 35 다음 그림을 통해 각 값이 어디에 위치하는지 확인할 수 있습니다. 이 문제는 일종의 수열 문제입니다. 따라
바리뇽의 평행사변형(Varignons Parallelogram)은 사각형의 각 변의 중점을 연결하여 만들어지는 평행사변형입니다. 예를 들어 사각형 ABCD가 있고, 각 변의 중점을 P, Q, R, S라고 가정해 보겠습니다. 이 중점들을 순서대로 모두 연결하면 항상 하나의 평행사변형 PQRS가 만들어지는데, 이것이 바로 바리뇽의 평행사변형입니다. 이 튜토리얼에서는 사각형의 두 대각선의 길이와 넓이가 주어졌을 때, 바리뇽 평행사변형의 둘레와 넓이를 구하는 방법을 알아보겠습니다. 입력과 출력의 예는 다음과 같습니다. 입력: d1 =
이 튜토리얼에서는 두 개의 배열 A와 B가 주어졌을 때, A의 순열(permutation) 중에서 A[i] > B[i]를 만족하는 인덱스의 개수가 최대가 되는 순열을 하나 출력하는 문제를 다룹니다.문제 예시입력: A = [12, 22, 41, 13], B = [1, 20, 10, 12] 출력: 12, 22, 41, 13 입력: A = [2, 5, 9, 7], B = [1, 12, 4, 54] 출력: 2 7 5 9조건을 만족하는 답이 여러 개 존재할 수 있으며, 그 경우 아무 답이나 하나만 출력하면 됩니다.접근 방법이 문제는
문자열의 순열(permutation)이란 주어진 문자열의 문자들을 다양한 방식으로 재배치하여 만들 수 있는 모든 조합을 의미합니다. 이번 튜토리얼에서는 C++의 표준 템플릿 라이브러리(STL)를 활용하여 주어진 문자열의 모든 순열을 출력하는 방법을 알아보겠습니다.예시입력 : s = ADT 출력 : ADT, ATD, DAT, DTA, TAD, TDA 설명 : 위 출력 결과를 보면 모든 문자열이 입력 문자열에 포함된 동일한 세 개의 문자로 구성되어 있으며, 단순히 순서만 바뀐 형태입니다. 따라서 이들은 문자열의 순열 정의에 부합하며