이 문제에서는 N-ary(다진) 트리가 주어지며, 우리의 목표는 이 트리의 전위 순회(preorder traversal) 결과를 출력하는 것입니다. 재귀 호출 없이 스택(stack) 자료구조만을 사용해 해결하는 방법을 단계별로 알아보겠습니다.기본 개념 정리N-ary 트리(N-ary Tree)N-ary 트리는 모든 노드가 최대 N개의 자식 노드를 가질 수 있는 트리입니다. 예를 들어 2-ary 트리(이진 트리)는 각 노드가 최대 2개의 자식 노드를 가질 수 있습니다.전위 순회(Preorder Traversal)전위 순회는 트리의 노드
문제 소개 이 문제에서는 하나의 이진 트리(binary tree)와 특정 노드의 값이 주어지며, 해당 노드의 전위 순회 후속자(preorder successor)를 출력하는 것이 목표입니다. 기본 개념 정리 이진 트리(Binary Tree): 각 노드가 최대 2개의 자식 노드를 가질 수 있는 특수한 트리 구조입니다. 전위 순회(Preorder Traversal): 루트 노드를 가장 먼저 방문하고, 그다음 왼쪽 자식, 마지막으로 오른쪽 자식을 방문하는 트리 순회 방식입니다. 전위 순회 후속자(Preorder Successor): 전
이 문제에서는 하나의 이진 트리(Binary Tree)와 특정 노드 값이 주어지며, 해당 노드의 전위 선행자(Preorder Predecessor)를 출력하는 것이 목표입니다.핵심 개념 정리이진 트리(Binary Tree)이진 트리는 각 노드가 최대 2개의 자식 노드(왼쪽 자식, 오른쪽 자식)를 가질 수 있는 특수한 형태의 트리 자료구조입니다.전위 순회(Preorder Traversal)전위 순회는 트리의 노드를 탐색하는 방법 중 하나로, 루트 노드 → 왼쪽 자식 → 오른쪽 자식 순서로 방문합니다.전위 선행자(Preorder Pre
이 문제에서는 이진 트리의 중위 순회(inorder)와 후위 순회(postorder) 결과가 주어지며, 우리의 목표는 해당 트리의 전위 순회(preorder) 결과를 출력하는 것입니다. 먼저 예시를 통해 문제를 살펴보겠습니다. Input: inorder: 16 7 21 12 1 5 9 postorder: 16 21 7 1 9 5 12 Output: preorder: 12 7 16 21 5 1 9 위 입력값에 대응하는 이진 트리는 다음과 같습니다. 문제 해결 접근 방법 가장 단순한 방법은 주어진 두 순회 결과로 트리를 직접 생성
이 문제에서는 a와 b로만 구성된 문자열 str과 정수 N이 주어집니다. 주어진 문자열을 N번 반복하여 이어 붙여 새로운 문자열을 만들었을 때, 그 안에서 a의 개수가 b의 개수보다 많은 부분 문자열의 총 개수를 구하는 것이 우리의 과제입니다.문제 예시예제를 통해 문제를 자세히 살펴보겠습니다.입력: aab 2 출력: 9 설명: 생성된 문자열은 aabaab입니다. a 개수가 b보다 많은 부분 문자열: a, aa, aab, aaba, aabaa, aabaab, aba, baa, abaa접근 방법이 문제를 해결하려면 반복해서 만들어진 전
이 문제에서는 접두사(prefix) 표기식이 주어지며, 이를 접미사(postfix) 표기식으로 변환하여 출력하는 것이 목표입니다.접두사와 접미사 표기법이란?접두사 표기식은 연산자가 피연산자 앞에 위치하는 표현 방식입니다.예시: +AB접미사 표기식은 연산자가 피연산자 뒤에 위치하는 표현 방식입니다.예시: AB/이때 중요한 조건은 접두사를 접미사로 변환하는 과정에서 중위(infix) 표기식을 거치지 않고 직접 변환해야 한다는 점입니다.문제 예시입력: /+XY+NM출력: XY+NM+/ (X+Y)/(N+M)해결 알고리즘이 문제는 스택(st
이 문제에서는 전위 표기식(prefix expression)이 주어지며, 이를 중위 표기식(infix expression)으로 변환하여 출력하는 것이 목표입니다.전위 표기식과 중위 표기식이란?전위 표기식은 연산자가 피연산자 앞에 위치하는 표현식입니다.예: +AB중위 표기식은 연산자가 두 피연산자 사이에 위치하는 표현식으로, 우리가 일반적으로 수학에서 사용하는 방식입니다.예: A+B중위 표기식은 사람이 식을 이해하기 쉽도록 만들어진 형태입니다. 반면 컴퓨터는 실제 연산을 수행할 때 전위 또는 후위(postfix) 표기식(주로 후위 표
문제 개요이 문제에서는 정수 값으로 이루어진 2차원 배열 mat[][]이 주어지며, 우리의 과제는 이 배열의 접두사 합(Prefix Sum) 행렬을 출력하는 것입니다.접두사 합 행렬이란?접두사 합 행렬에서 각 원소는 해당 위치를 기준으로 위쪽과 왼쪽에 있는 모든 원소들의 합을 의미합니다. 즉, 다음과 같이 정의할 수 있습니다.prefixSum[i][j] = mat[i][j] + mat[i-1][j] + ... + mat[0][j] + mat[i][j-1] + ... + mat[i][0]예시로 이해하기구체적인 예시를 통해 문제를 살펴
두 명의 플레이어 X와 Y가 n개의 숫자로 이루어진 배열을 가지고 게임을 진행하는 상황을 생각해 봅시다. 각 플레이어는 배열에서 숫자를 선택하게 되며, 우리의 목표는 게임이 시작되기 전에 최종 승자를 미리 예측하는 것입니다. 게임 규칙 플레이어 X가 승리하려면, X가 선택한 숫자들의 합과 Y가 선택한 숫자들의 합의 절대 차이가 4의 배수여야 합니다. 절대 차이가 4로 나누어 떨어지지 않으면 플레이어 Y가 승리합니다. 게임은 항상 플레이어 X부터 시작합니다. 예제로 이해하기 입력: a[] = {3, 6, 9, 12} 출력: X
이 게임에는 두 명의 플레이어 X와 Y가 참여합니다. 두 사람이 모두 최적의 전략으로 게임을 진행하고, X가 먼저 시작한다고 가정할 때 누가 승리할지 예측하는 것이 우리의 과제입니다.게임 규칙코인 게임에서는 각각 N개와 M개의 코인이 담긴 두 개의 더미가 주어집니다. 한 플레이어가 먼저 두 더미 중 하나를 선택한 뒤, 선택한 더미를 반으로 나누는 작업을 반복합니다. 이 과정은 어느 한쪽 플레이어가 더 이상 더미를 나눌 수 없게 될 때까지 계속되며, 마지막에 나눌 수 없는 상황에 놓인 플레이어가 패배합니다.예시를 통해 문제를 살펴보겠
부동 소수점 숫자의 정밀도(Precision)란 소수점 이하의 값을 저장할 수 있는 정확도를 의미합니다.예를 들어 10/6 = 1.6666666...과 같은 순환 소수는 무한히 이어지기 때문에 저장하는 데 무한한 메모리 공간이 필요합니다.따라서 이런 경우 메모리 오버플로우를 방지하기 위해 컴파일러는 숫자에 정밀도 제한을 설정합니다. C++에서 float 값의 정밀도는 소수점 이하 6~7자리로 설정되며, 그 이후 소수가 계속 이어지면 해당 값은 버려집니다.값이 잘려나갈 때 발생할 수 있는 큰 오차를 방지하기 위해 C++은 부동 소수점
시간 복잡도(Time Complexity)란 알고리즘이 작업을 완료하기까지 걸리는 시간을 의미합니다. 알고리즘의 효율성을 나타내는 핵심 지표이며, 여러 알고리즘을 비교 분석할 때 중요하게 활용됩니다. 일반적으로 시간 복잡도가 낮은 알고리즘일수록 더 효율적이라고 할 수 있습니다. 예제 1 다음 코드의 시간 복잡도를 구해 보세요. for(i= 0 ; i < n; i++){ cout<< i << " " ;
문자열(String)은 프로그래밍에서 가장 기본적이면서도 중요한 데이터 유형 중 하나입니다. 문자열은 본질적으로 문자형(char) 배열이며, GATE와 같은 경쟁 시험에서도 단골 출제 주제입니다. 이번 글에서는 C++ 문자열의 핵심 개념을 먼저 정리한 뒤, 실제 출력 결과를 예측하는 연습 문제를 통해 개념을 확실히 다져 보겠습니다. C++에서 문자열을 저장하는 두 가지 방법 C++에서 문자열은 크게 두 가지 방식으로 저장할 수 있습니다. 문자 배열 사용: char str[size]; 포인터 사용: char *ch = Hello;
배열(Array)은 데이터를 연속된(contiguous) 메모리 공간에 순차적으로 저장하는 가장 기본적인 자료구조입니다. 같은 타입의 여러 값을 하나의 이름으로 관리할 수 있어 효율적이며, 인덱스를 통해 각 요소에 빠르게 접근할 수 있습니다.배열 선언하기C++에서 배열은 다음과 같은 문법으로 선언합니다.int arr[5]; // 1차원(1-D) 배열 선언 int arr[3][3]; // 2차원(2-D) 배열 선언선언과 동시에 초기화할 때, 지정한 요소의 개수보다 적은 값만 넣으면 나머지 요소는 자동으로 0으로 초기화됩니
개요 이 글에서는 C++로 작성된 이중 연결 리스트(doubly linked list)에서 잘못 연결된 포인터를 찾아 수정하는 프로그램을 다룹니다. 정상적인 이중 연결 리스트에서는 각 노드의 next 포인터가 다음 노드를, prev 포인터가 이전 노드를 가리켜야 합니다. 그러나 문제가 된 리스트에는 하나의 노드가 인접하지 않은 노드를 가리키고 있으며, 우리의 목표는 이 잘못된 포인터를 찾아 올바른 대상, 즉 바로 옆에 있는 노드를 가리키도록 수정하는 것입니다. 알고리즘 접근 방식 리스트를 앞에서부터 순회하면서 모든 노드의 연결 관
이 튜토리얼에서는 n×m 크기의 그리드를 모두 칠할 때 드는 최소 비용을 구하는 프로그램을 다룹니다. 두 개의 정수 n과 m이 주어졌을 때, n×m 그리드 전체를 칠하는 최소 비용을 계산하는 것이 우리의 과제입니다. 여기서 한 셀을 칠하는 비용은 해당 셀에 인접한(즉, 변을 맞대고 있는) 셀 중 이미 칠해진 셀의 개수와 같다고 정의됩니다. 접근 방법 핵심 아이디어는 간단합니다. 그리드의 모든 셀이 결국 칠해지기 때문에, 서로 인접한 두 셀의 쌍은 반드시 한 번씩 비용에 기여하게 됩니다. 두 셀 중 나중에 칠해지는 순간, 이미 칠해진
문제 소개이 튜토리얼에서는 괄호 문자열의 균형을 맞추는 데 드는 최소 비용을 구하는 C++ 프로그램을 살펴보겠습니다.여기서 비용이란 괄호를 한 칸씩 이동시키는 횟수를 의미합니다. 여는 괄호 ( 와 닫는 괄호 ) 로 구성된 문자열이 주어졌을 때, 괄호들의 위치를 적절히 이동시켜 전체 문자열이 올바른 괄호 식이 되도록 만들어야 합니다. 만약 여는 괄호와 닫는 괄호의 개수가 달라 균형을 맞추는 것이 아예 불가능하다면 -1을 반환합니다.알고리즘 접근 방식핵심 아이디어는 접두사 합(prefix sum)을 활용하는 것입니다.여는 괄호 ( 를
이 튜토리얼에서는 주어진 문자열을 팬그램(pangram)으로 만드는 데 드는 총비용을 계산하는 프로그램을 다룹니다.팬그램이란?팬그램은 영어 알파벳의 모든 문자(a부터 z까지)가 최소 한 번 이상 포함된 문자열을 의미합니다. 대표적인 예로 The quick brown fox jumps over the lazy dog가 있습니다.문제 정의정수 배열과 하나의 문자열이 주어집니다. 배열의 각 원소는 해당 위치의 알파벳을 문자열에 추가할 때 드는 비용을 나타냅니다. 즉, arr[0]은 a를 추가하는 비용, arr[1]은 b를 추가하는 비용입
이 튜토리얼에서는 0을 자릿수 중 하나로 포함하는 d자리 양의 정수의 개수를 구하는 프로그램을 C++로 작성하는 방법을 알아봅니다. 문제 이해하기 숫자 d가 하나 주어졌을 때, d자리 양의 정수 전체 중에서 0을 적어도 하나 포함하고 있는 수의 개수를 세어 출력하는 것이 목표입니다. 예를 들어 d = 2인 경우를 생각해 보겠습니다. 두 자리 양의 정수는 10부터 99까지 총 90개이며, 이 가운데 0을 포함하지 않는 수는 11, 12, ..., 99처럼 81개입니다. 따라서 0을 포함하는 수는 90 − 81 = 9개(10, 20,
이 튜토리얼에서는 정렬된 이진 배열에서 1의 개수를 찾는 프로그램을 다뤄보겠습니다.문제의 조건은 다음과 같습니다. 1과 0으로만 구성된 배열이 주어지며, 배열 안에 포함된 1의 개수를 세어 반환해야 합니다.접근 방법배열은 1이 먼저 나오고 그 뒤에 0이 오는 형태로 정렬되어 있기 때문에, 처음부터 끝까지 하나씩 확인하는 O(n) 방식 대신 이진 탐색(Binary Search)을 활용할 수 있습니다. 이진 탐색을 사용하면 마지막 1이 등장하는 위치를 O(log n) 시간 복잡도로 찾아낼 수 있어 훨씬 효율적입니다.알고리즘 동작 원리1