문제 개요이번 튜토리얼에서는 무방향 그래프(undirected graph)를 방향 그래프(directed graph)로 변환하되, 변환된 그래프에 길이가 1보다 큰 경로가 존재하지 않도록 만드는 방법을 C++로 구현해 봅니다.여기서 길이가 1보다 큰 경로가 없다는 것은, 간선에 방향을 부여한 뒤 어떤 정점에서 출발하더라도 간선을 두 번 이상 연속해서 따라갈 수 없다는 의미입니다. 즉, 어느 정점에서 이동을 시작해도 한 번의 이동 후에는 반드시 더 나아갈 수 없는 정점에 도달해야 합니다.접근 방식: 이분 그래프 판별이 문제의 핵심은
이 튜토리얼에서는 C++를 사용하여 24시간제(HH:MM:SS)로 표현된 시간을 오전·오후 표시가 포함된 12시간제 형식으로 변환하는 프로그램을 만드는 방법을 알아봅니다.입력으로는 24시간제 형식의 시간 문자열이 주어지며, 우리의 목표는 여기에 AM(오전) 또는 PM(오후) 표기를 덧붙인 12시간제 형식으로 바꾸는 것입니다. 예를 들어 17:35:20은 5:35:20 PM으로 변환되어야 합니다.변환 원리변환 로직은 생각보다 간단하며, 다음 세 가지 규칙만 기억하면 됩니다.AM/PM 판별: 시(hour) 값이 12보다 작으면 AM,
이 문제에서는 문자열 배열이 주어지며, 해당 배열에 포함된 모든 아나그램 쌍을 찾아 출력해야 합니다.아나그램(Anagram)은 한 문자열의 문자들을 재배열하여 만들 수 있는 다른 문자열을 의미합니다. 예를 들어 hello와 lolhe는 서로 아나그램 관계입니다.문제를 더 잘 이해하기 위해 예시를 살펴보겠습니다.입력: array = {hello, hrdef, from, lohel, morf}출력: [hello, lohel], [from, morf]접근 방법이 문제는 중첩 반복문(nested loop)을 사용하여 해결할 수 있습니다.
문제 개요이 문제에서는 정렬되지 않은 배열(unsorted array)이 주어지며, 배열 내에 존재하는 원소들 중 합(sum)이 서로 동일한 모든 쌍(pair)을 찾아 출력해야 합니다.예제를 통해 문제를 좀 더 구체적으로 살펴보겠습니다.입력: array = [12, 13, 20, 5]출력: [12, 13]과 [20, 5]의 합은 25로 동일합니다.접근 방법이 문제를 해결하려면 배열의 모든 원소 조합에 대해 쌍을 만들고, 각 쌍의 합을 계산한 뒤 합이 같은 쌍들을 그룹으로 묶어야 합니다. 또한 중복된 쌍이 여러 번 출력되는 것을 방지
이 문제에서는 하나의 이진 탐색 트리(Binary Search Tree)가 주어지며, 우리의 목표는 값이 홀수인 모든 노드를 찾아 출력하는 것입니다.이진 탐색 트리란?이진 탐색 트리는 다음과 같은 특성을 가진 특수한 형태의 트리 자료구조입니다.왼쪽 서브트리에는 항상 루트 노드보다 작은 값들이 위치합니다.오른쪽 서브트리에는 항상 루트 노드보다 큰 값들이 위치합니다.왼쪽과 오른쪽 서브트리 역시 위 두 가지 성질을 재귀적으로 만족해야 합니다.문제 이해를 위한 예시예를 들어 다음과 같은 이진 탐색 트리가 주어졌다고 가정해 보겠습니다.출력
문제 개요이 문제에서는 N개의 숫자로 이루어진 배열과 하나의 숫자 X가 주어집니다. 우리가 해야 할 일은 배열에 있는 숫자 중 소인수 집합이 X의 소인수 집합의 부분집합이 되는 모든 숫자를 찾아 출력하는 것입니다.예를 들어 문제를 이해해 보겠습니다.입력: X = 30, array = {2, 3, 6, 10, 12}출력: 2 3 6X = 30의 소인수는 2, 3, 5입니다. 따라서 소인수가 2, 3, 5로만 구성된 숫자들만 조건을 만족합니다. 위 예시에서 2, 3, 6은 모두 2와 3으로만 이루어져 있으므로 조건을 충족하지만, 10(
이 문제에서는 정수 N이 주어지며, 최대 2개의 서로 다른 숫자(고유 숫자)만 사용하여 만들 수 있는 N보다 작은 모든 수를 출력해야 합니다. 즉, 하나의 숫자를 구성할 때 사용할 수 있는 숫자 종류는 최대 2개입니다.예시를 통해 문제를 이해해 보겠습니다.입력: N = 17출력: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16N이 17인 경우, 1부터 16까지의 모든 수는 한두 개의 숫자만으로 구성되므로 전부 출력됩니다. 반면 100 같은 수는 1, 0, 0으로 세 개의 숫자가 관련되어 있지만 실제 사용된 고유
이 문제에서는 하나의 이진 트리(binary tree)와 숫자 K가 주어지며, 리프 노드로부터 거리가 k만큼 떨어진 트리의 모든 노드를 출력해야 합니다.핵심 개념 정리이진 트리(Binary Tree)란 각 노드가 최대 두 개의 자식 노드(0개, 1개 또는 2개)를 가질 수 있는 특수한 형태의 트리 자료구조입니다.리프 노드(Leaf Node)는 이진 트리에서 가장 끝에 위치한, 즉 자식 노드가 없는 노드를 의미합니다.이 문제에서 리프 노드로부터의 거리는 해당 노드가 리프 노드보다 몇 단계 위의 레벨에 있는지를 나타냅니다. 예를 들어,
문제 개요이 문제에서는 하나의 최소 힙(Min Heap)과 값 x가 주어지며, 힙에 속한 노드 중 값이 x보다 작은 모든 노드를 찾아 출력해야 합니다.최소 힙은 모든 부모 노드의 값이 자식 노드의 값보다 작거나 같은 특수한 형태의 이진 트리입니다. 이러한 성질 덕분에 루트 노드에는 항상 힙 전체에서 가장 작은 값이 위치하게 됩니다.문제 이해를 위한 예시다음 예시를 통해 문제를 살펴보겠습니다.X = 45출력 − 2 4 7 10 17 22 33 34접근 방법이 문제를 해결하는 핵심은 최소 힙 전체를 전위 순회(pre-order trav
이 문제에서는 하나의 이진 트리(binary tree)와 정수 K가 주어지며, 자식 서브트리(subtree)에 정확히 K개의 리프(잎) 노드를 가진 모든 노드를 찾아 출력해야 합니다. 핵심 개념 정리 이진 트리는 각 노드가 최대 두 개의 자식 노드(0~2개)만 가질 수 있는 특수한 형태의 트리입니다. 리프 노드(leaf node)는 트리의 맨 끝에 위치하며 자식 노드가 없는 노드를 의미합니다. 예시를 통해 문제를 구체적으로 살펴보겠습니다. K = 2 출력 결과 − {S} 문제 해결 접근 방법 이 문제는 후위 순회(postorde
이 문제에서는 하나의 이진 트리(binary tree)와 트리 내의 두 개의 레벨(상위 레벨과 하위 레벨)이 주어지며, 상위 레벨과 하위 레벨 사이에 존재하는 모든 노드를 출력해야 합니다.이진 트리는 각 노드가 최대 두 개의 자식 노드(0개, 1개 또는 2개)만 가질 수 있는 특수한 형태의 트리 구조입니다.예시를 통해 문제를 더 자세히 살펴보겠습니다.상위 레벨(upper) − 3하위 레벨(lower) − 1출력 결과 −6 3 9 7 4 8 10문제 해결 접근 방법이 문제를 해결하려면 지정된 레벨에 있는 트리의 노드들을 출력해야 합니
문제 개요 이 문제에서는 하나의 이진 트리, 목표 노드(target node), 그리고 정수 K가 주어집니다. 목표 노드로부터 거리가 정확히 K만큼 떨어져 있는 트리 내의 모든 노드를 찾아 출력하는 것이 과제입니다. 이진 트리(Binary Tree)는 각 노드가 최대 두 개의 자식 노드(없음·하나·둘)를 가질 수 있는 특수한 형태의 트리 자료구조입니다. 예제로 이해하기 다음 예제를 통해 문제를 살펴보겠습니다. K = 2 목표 노드: 9 출력 결과: 5 1 3 설명 − 거리는 목표 노드보다 위쪽(조상 방향), 아래쪽(자손 방향)
문제 개요이 문제에서는 숫자 N이 주어지며, 왼쪽(최상위 자릿수)에서 오른쪽(최하위 자릿수)으로 갈수록 자릿값이 엄격하게 증가하는 모든 n자리 숫자를 출력해야 합니다. 즉, 각 자릿수는 바로 오른쪽에 있는 자릿수보다 반드시 작아야 합니다.예시를 통해 문제를 살펴보겠습니다.입력 − n = 2출력 −01 02 03 04 05 06 07 08 09 12 13 14 15 16 17 18 19 23 24 25 26 27 28 29 34 35 36 37 38 39 45 46 47 48 49 56 57 58 59 67 68
이 문제에서는 정수 n이 주어졌을 때, 짝수 자리 숫자들의 합과 홀수 자리 숫자들의 합의 절대 차이가 1이 되는 모든 n자리 숫자를 출력해야 합니다. 단, 숫자를 생성할 때 맨 앞에 오는 0(선행 0)은 유효한 자릿수로 간주하지 않습니다.절대 차이(absolute difference)란 두 수의 차이를 절댓값, 즉 항상 양수로 나타낸 값을 의미합니다.예시를 통해 문제를 좀 더 구체적으로 살펴보겠습니다.입력: n = 2 출력: 10 12 21 23 32 34 43 45 54 56 65 67 76 78 87 89 98 설명 : 출력 결
이 문제에서는 두 개의 숫자 n과 sum이 주어집니다. 우리가 해야 할 일은 각 자릿수의 합이 sum과 정확히 일치하는 모든 n자리 숫자를 찾아 출력하는 것입니다. 단, 앞자리가 0으로 시작하는 숫자(선행 0)는 유효한 n자리 숫자로 간주하지 않습니다.문제 이해하기예시를 통해 문제를 살펴보겠습니다.입력: n = 2 , sum = 5출력: 14 23 32 41 50설명: 위 모든 숫자의 자릿수 합은 5입니다.해결 접근 방법이 문제를 해결하려면 자릿수의 합이 주어진 sum 값과 일치하는 모든 n자리 숫자를 찾아야 합니다. 이를 위해 재
이 문제에서는 숫자 n이 주어졌을 때, 모바일 키패드 버튼을 눌러서 만들 수 있는 모든 n자리 숫자 패턴을 출력해야 합니다. 단, 버튼을 누를 때는 현재 누른 버튼에 인접한 버튼만 누를 수 있다는 제약 조건이 있습니다. 즉, 왼쪽, 오른쪽, 위, 아래 방향에 위치한 키만 연속해서 누를 수 있습니다.기존 모바일 키패드의 구조구형 휴대폰의 키패드는 다음과 같은 배치를 하고 있습니다.12ABC3DEF4GHI5JKL6MNO7PQRS8TUV9WXYZ*0#여기서 *와 # 키는 유효한 숫자가 아니므로 탐색 대상에서 제외됩니다.문제 이해를 위한
이 문제에서는 정수 n이 주어지며, n보다 작거나 같은 모든 곱셈 소수(multiplicative prime)를 출력해야 합니다.곱셈 소수란?곱셈 소수는 각 자릿수의 곱 역시 소수가 되는 소수를 의미합니다. 예를 들어 2, 3, 5, 7, 13, 17 등이 대표적인 곱셈 소수입니다.반면 23은 소수이지만 곱셈 소수에는 해당되지 않습니다. 그 이유는 자릿수의 곱이 2 × 3 = 6으로 소수가 아니기 때문입니다.문제 이해를 위한 예시예시를 통해 문제를 더 쉽게 이해해 보겠습니다.입력: n = 9출력: 2 3 5 7문제 해결 접근 방법이
이 문제에서는 n진 트리(n-ary tree)의 간선 정보가 담긴 2차원 배열이 주어지며, 이 배열을 이용해 만들어진 트리의 모든 리프 노드(leaf node)를 출력해야 합니다.n진 트리란?n진 트리는 각 노드가 최대 n개의 자식을 가질 수 있는 트리입니다. 즉, 하나의 노드는 1개, 2개, ... n개까지의 자식 노드를 가질 수 있습니다.문제 예시예제를 통해 문제를 자세히 살펴보겠습니다.입력: edge[][] = {{5,8}, {5,6}, {8,1}, {8,4}, {6,7}} 출력: 1 4 7설명: 주어진 간선 배열로 트리를 구
문제 개요이 문제에서는 하나의 이진 트리(binary tree)가 주어지며, 트리에 포함된 모든 리프 노드(leaf node, 자식이 없는 노드)를 오른쪽에서 왼쪽 순서대로 출력해야 합니다.예시를 통해 문제를 이해해 보겠습니다.입력 −출력 − 7 4 1위 예시에서 트리의 리프 노드는 7, 4, 1이며, 오른쪽에서 왼쪽 순서로 출력됩니다.이 문제를 해결하려면 이진 트리를 순회(traverse)해야 하며, 순회 방식은 크게 두 가지로 나눌 수 있습니다.방법 1: 전위 순회(Preorder Traversal) – 재귀 사용전위 순회는 재
문제 개요이 문제에서는 하나의 이진 트리가 주어지며, 트리의 모든 리프 노드를 왼쪽에서 오른쪽 순서로 출력해야 합니다. 여기서 리프 노드란 왼쪽이나 오른쪽에 자식 노드를 가지지 않는 노드를 의미합니다.예시예시를 통해 문제를 이해해 보겠습니다.입력 −출력 − 1 4 7접근 방법이 문제는 깊이 우선 탐색(Depth-First Search, DFS)을 활용하여 해결할 수 있습니다. 루트 노드부터 탐색을 시작하며, 방문한 노드가 리프 노드인지 검사합니다. 해당 노드가 리프 노드라면 그 값을 출력하고, 그렇지 않다면 왼쪽과 오른쪽 자식 서브