개념주어진 이진 트리(Binary Tree)에 대해 다음과 같은 값을 계산하여 반환하는 문제입니다.트리의 모든 레벨을 순회하면서, 해당 레벨에 리프(leaf) 노드가 존재하면 그 리프 노드들의 데이터 합계를 구합니다. 리프가 없는 레벨은 무시합니다.구한 합계들을 모두 곱한 결과를 반환합니다.입력 예시 1다음 트리의 루트 3 / \ 8 6 \\ 10출력80첫 번째 레벨에는 리프가 없습니다. 두 번째 레벨에는 리프 8이 하나 있고, 세 번째 레벨에도 리프 10이
문제 개요두 정수 N과 K가 주어졌을 때, 이 숫자들을 비트 OR(bitwise OR) 연산했을 때 결과가 정확히 K가 되는 N개의 서로 다른 정수를 찾는 것이 목표입니다. 만약 가능한 답이 존재하지 않는다면 -1을 출력해야 합니다.입력 및 출력 예시입력:N = 4, K = 6출력:6 0 1 2입력:N = 11, K = 6출력:-1두 번째 예시에서는 조건을 만족하는 서로 다른 11개의 정수를 만들 수 없으므로 해답이 존재하지 않습니다.접근 방법여러 숫자의 비트 OR 결과가 K가 되려면, K에서 비트가 0인 자리는 모든 숫자에서 반드
개념 소문자 알파벳으로만 구성된 길이 m의 문자열이 주어졌을 때, 이 문자열의 모든 순열을 사전식(lexicographic) 순서로 정렬했을 때의 n번째 순열을 구하는 것이 이 문제의 목표입니다. 예제 1 입력: str[] = "pqr", n = 3 출력: Result = "qpr" 설명: 사전순으로 정렬된 모든 순열은 pqr, prq, qpr, qrp, rpq, rqp이며, 세 번째 순열은 "qpr"입니다. 예제 2 입력: str[] = "xyx", n
개념수열 bn이 다음과 같은 반복 관계로 정의되어 있다고 가정해 보겠습니다.b1 = 1, bn+1/bn = 2n이때 우리의 목표는 주어진 n에 대해 log2(bn)의 값을 구하는 것입니다.입력 예시 16출력15설명: log2(bn) = n(n-1)/2 = (6 × 5) / 2 = 15입력 예시 2200출력19900풀이 방법주어진 반복 관계는 다음과 같습니다.bn+1/bn = 2n같은 방식으로 n을 하나씩 줄여가며 식을 나열하면 다음과 같습니다.bn/bn-1 = 2n-1bn-1/bn-2 = 2n-2…b2/b1 = 21위의
개념m개의 노드로 구성된 트리가 있고, 각 노드에는 하나의 값이 연결되어 있다고 가정해 봅시다. 이때 임의의 간선을 끊으면 트리가 분리되어 두 개의 새로운 트리가 만들어집니다. 우리가 구해야 할 것은, 특정 간선을 끊었을 때 분리된 두 트리에 속한 노드 값들의 비트 OR(Bitwise OR) 결과가 서로 같아지도록 만들 수 있는 그런 간선의 개수입니다. 단, 모든 노드의 값은 10^6 이하라고 가정합니다.입력 예시values[] = {1, 3, 1, 3} 1 / | \
개념어떤 배열 array[]에 다른 배열을 구성하는 요소들의 모든 가능한 쌍에 대한 GCD(최대공약수) 값이 저장되어 있다고 가정해 봅시다. 이때 우리의 과제는 이 GCD 배열을 계산하는 데 사용된 원래 숫자들을 역으로 찾아내는 것입니다.예를 들어, 원래 배열이 {13, 6}이라면 두 요소로 만들 수 있는 모든 쌍(자기 자신과의 쌍 포함)의 GCD는 다음과 같습니다.gcd(13, 13) = 13gcd(13, 6) = 1gcd(6, 13) = 1gcd(6, 6) = 6따라서 입력으로 {13, 1, 1, 6}이 주어지면, 출력으로 원래
정렬된 단일 연결 리스트(singly linked list)와 목표 값 x가 주어졌을 때, 두 노드의 데이터 합이 x가 되는 모든 쌍(pair)을 찾아야 합니다. 여기서 중요한 제약 조건은 추가 공간을 사용할 수 없다는 점과, 시간 복잡도가 O(n)이어야 한다는 점입니다.예를 들어 입력이 4→7→8→9→10→11→12이고 x = 19라면, 출력은 다음과 같습니다.[(7, 12), (8, 11), (9, 10)]접근 방법배열이라면 양 끝에 두 개의 포인터를 두고 안쪽으로 이동시키는 투 포인터 기법으로 간단히 해결할 수 있습니다. 하지
문제 소개이진 행렬(binary matrix)이 주어졌을 때, 행렬 내에서 서로 간의 비트 차이(bit difference)가 가장 큰 두 행의 쌍을 찾아야 합니다.예를 들어 아래와 같은 행렬이 입력으로 주어진다면, 2번째 행과 3번째 행 사이의 비트 차이가 4로 가장 크기 때문에 출력은 [2, 3]이 됩니다.접근 방법: 트라이(Trie) 활용이 문제는 트라이(Trie) 자료구조를 활용하면 효율적으로 해결할 수 있습니다. 각 행을 이진 경로처럼 트라이에 삽입한 뒤, 현재 행과 가장 유사한 경로 또는 가장 다른 경로를 탐색하는 방식입
개념 양의 서로 다른 정수로 구성되어 오름차순으로 정렬된 이중 연결 리스트(Doubly Linked List)가 주어졌을 때, 두 노드 데이터의 곱이 주어진 값 x와 같아지는 모든 쌍(pair)을 추가 공간을 사용하지 않고 찾아내는 것이 이 문제의 목표입니다. 입력 / 출력 예시 예시 1 List = 1 <=> 2 <=> 4 <=> 5 <=> 6 <=> 8 <=> 9 x = 8 출력: (1, 8), (2, 4) 예시 2 List = 1 <=> 2 <=
이 문제에서는 배열 arr[]가 주어지며, 인접한 두 요소를 동시에 선택하지 않는 조건 하에서 만들 수 있는 최대 합을 구하는 프로그램을 C++로 작성하는 것이 목표입니다.문제 설명배열에서 합을 구할 때, 합에 포함된 숫자들 중 어떤 두 수도 원래 배열에서 서로 인접해서는 안 됩니다. 이 조건을 만족하면서 얻을 수 있는 최대 합을 찾아야 합니다.예시를 통해 문제를 이해해 보겠습니다.입력arr[] = {5, 1, 3, 7, 9, 2, 5}출력22설명인덱스 0부터 시작해 한 칸씩 건너뛰며 선택한 경우 : 5 + 3 + 9 + 5 = 2
이 문제에서는 배열 arr[]가 주어지며, 우리의 목표는 배열에서 서로 인접한 두 요소를 동시에 포함하지 않는 조건 하에 얻을 수 있는 최대 합을 구하는 프로그램을 C++로 작성하는 것입니다. 문제 설명 배열에서 요소들을 선택하여 합을 만들되, 합산 시퀀스에 포함된 두 숫자가 원본 배열에서 서로 인접(바로 옆)해서는 안 됩니다. 이러한 조건을 만족하면서 얻을 수 있는 최대 합을 찾아야 합니다. 예시를 통해 문제를 이해해 보겠습니다. 입력 arr[] = {5, 1, 3, 7, 9, 2, 5} 출력 22 설명 인덱스 0부터 시작하여
이 문제에서는 2차원 배열 arr[][]가 주어지며, C++을 사용해 주어진 행렬에서 만들 수 있는 모든 부분행렬(sub-matrix) 중 최대 트레이스(trace)를 구하는 프로그램을 작성하는 것이 목표입니다.문제 설명트레이스(trace)란 행렬의 주대각선(main diagonal) 요소들의 합을 의미합니다. 즉, 원본 행렬에서 추출할 수 있는 모든 정사각형 부분행렬의 트레이스 값을 계산한 뒤, 그중 가장 큰 값을 찾아야 합니다.예제를 통해 문제를 자세히 살펴보겠습니다.입력arr[][] = {{-2, 5, 3}, {1, 6, 2}
문제 설명 이 문제에서는 한 역이 보유한 승강장 수를 나타내는 값 N이 주어지며, 각 승강장에는 두 개의 선로가 있습니다. 또한 T개의 열차가 해당 역을 지나가며, 각 열차의 도착 시간과 출발 시간이 함께 주어집니다. 모든 열차는 특정 승강장에 정차하도록 지정되어 있습니다. 우리의 목표는 C++로 정차를 제공할 수 있는 최대 열차 수를 구하는 프로그램을 작성하는 것입니다. 예시를 통해 문제를 살펴보겠습니다. 입력 N = 3, T = 5 Trains = {{0915, 0930, 2}, {0930, 0945, 3}, {0930, 12
이 문제에서는 0으로 초기화된 N개의 원소를 가진 배열 arr[]가 주어집니다. 우리가 작성해야 할 프로그램은 m번의 범위 증가(range increment) 연산을 모두 수행한 뒤, 배열에서 최댓값을 찾아 출력하는 것입니다. 문제 설명 배열에는 다음과 같은 형태의 범위 증가 연산이 m번 적용됩니다. update[L, R, K] = 인덱스 L부터 R까지의 모든 원소에 값 K를 더합니다. m번의 연산이 모두 끝난 후, 배열에서 가장 큰 값을 가지는 원소를 찾아야 합니다. 예시를 통해 문제를 살펴보겠습니다. 입력 N = 6, m = 4
이 문제에서는 배열 arr가 주어지며, 배열 안에 K보다 크거나 같은 요소가 최소 K개 존재하는 최대값 K를 찾는 프로그램을 작성하는 것이 목표입니다.문제 설명배열에서 K 이상인 요소의 개수가 K개 이상이라는 조건을 만족하는 값을 K라고 할 때, 가능한 K 중 가장 큰 값을 구해야 합니다.예시입력: arr[] = {3, 5, 1, 7, 6, 6, 4, 8}출력: 5설명배열에서 5보다 크거나 같은 요소는 5, 6, 6, 7, 8로 총 5개입니다. 즉, K = 5일 때 조건을 충족합니다. 반면 K = 6인 경우 6 이상인 요소는 6,
문제 개요 팩토리얼(계승)은 해당 숫자까지의 모든 양의 정수를 곱한 값이므로, 입력 값이 조금만 커져도 결과가 기하급수적으로 증가합니다. 예를 들어 20!은 약 243경(2.43 × 1018)에 달합니다. 따라서 C++의 데이터 타입으로는 일정 크기 이상의 팩토리얼을 더 이상 저장할 수 없는데, 이번 글에서는 현재 사용 중인 머신에서 팩토리얼을 계산할 수 있는 최대 정수 값을 찾는 프로그램을 만들어 보겠습니다. 해결 접근 방식 부호 있는(signed) 정수 데이터 타입은 저장할 수 있는 최대값을 초과하면 오버플로우가 발생하여 음수
이 문제에서는 배열 arr[]과 숫자 M이 주어지며, 우리의 과제는 C++ 프로그램을 작성하여 최대 무게 차이(Maximum Weight Difference)를 계산하는 것입니다. 문제 설명 배열에서 M개의 원소를 선택했을 때, 선택한 원소들의 합과 나머지 원소들의 합 사이의 절대 차이가 최대가 되도록 하는 값을 찾아야 합니다. 예시를 통해 문제를 이해해 보겠습니다. 입력: arr[] = {3, 1, 6, 9, 4}, M = 3 출력: 15 설명 4, 6, 9를 선택하면 그 합은 19가 됩니다. 나머지 숫자들(3, 1)의 합은 4이
개요이 튜토리얼에서는 숫자를 나누어 계산하거나 그대로 두는 두 가지 방법 중 더 큰 값을 선택하여 최대값을 구하는 프로그램을 다룹니다.문제의 정의는 다음과 같습니다. 하나의 정수 값이 주어지면, 해당 수를 네 부분으로 재귀적으로 나누거나 그대로 사용하는 방식 중 최대값을 찾아야 합니다. 이를 수식으로 표현하면 다음과 같습니다.F(n) = max( F(n/2) + F(n/3) + F(n/4) + F(n/5), n )즉, 각 단계에서 원래 값 n을 그대로 취할지, 아니면 2, 3, 4, 5로 나눈 결과들의 합이 더 큰지를 비교하여 더
이 문제에서는 문자열 str과 두 개의 값 a, b로 이루어진 Q개의 쿼리가 주어집니다. 우리가 작성해야 할 프로그램은 C++을 사용하여 반복되는 문자열 안에서 주어진 위치의 문자들을 비교하는 쿼리를 처리하는 것입니다. 문제 설명 각 쿼리를 처리할 때마다 인덱스 a와 인덱스 b에 위치한 문자가 서로 같은지 확인하고, 그 결과에 따라 적절한 값을 반환해야 합니다. 예시를 통해 문제를 자세히 살펴보겠습니다. 입력: str = "tutorialspoint"Q = 2쿼리 = {{0, 2}, {4, 7}} 출력:Repea
이 문제에서는 하나의 숫자 N이 주어집니다. 우리가 해야 할 과제는 C++에서 값을 그대로 사용하거나 나누어 계산하는 두 가지 선택지 중 더 큰 값을 찾아 최댓값을 구하는 프로그램을 작성하는 것입니다.문제 설명최댓값을 구하기 위해 임의의 값에 대해 두 가지 방법을 고려할 수 있습니다. 첫째, 값을 그대로 사용하는 것이고, 둘째, 값을 나누어 얻은 결과들의 합으로 최댓값을 구하는 것입니다. 이때 나누어 계산한 값은 다음과 같은 형태로 추출됩니다.F(N/2) + F(N/3) + F(N/4) + F(N/5)예제로 이해하기입력: N = 8