이진 탐색 트리(Binary Search Tree, BST)는 효율적인 데이터 검색과 관리를 위해 설계된 특수한 형태의 트리 자료구조입니다. BST는 다음과 같은 규칙을 따릅니다.왼쪽 자식 노드의 값은 항상 부모 노드의 값보다 작습니다.오른쪽 자식 노드의 값은 항상 부모 노드의 값보다 큽니다.모든 노드는 각각 하나의 이진 탐색 트리를 이룹니다.이러한 규칙 덕분에 BST는 탐색(search), 최솟값·최댓값 찾기 같은 연산의 시간 복잡도를 크게 줄일 수 있습니다.이진 탐색 트리의 삭제(Delete) 연산삭제 연산은 트리에서 지정된 노
이진 트리(Binary Tree)는 트리의 각 노드가 최대 두 개의 자식 노드만 가질 수 있는 특수한 형태의 트리입니다. 이 두 자식 노드는 각각 왼쪽 자식(left child)과 오른쪽 자식(right child)이라고 부릅니다.이진 트리의 표현 방법트리를 컴퓨터 메모리에 표현하는 방법은 크게 두 가지가 있습니다.연결 리스트를 이용한 동적 노드 표현 — 각 노드가 포인터로 자식을 가리키는 방식배열을 이용한 순차 표현 — 인덱스 계산으로 부모·자식 관계를 파악하는 방식이 글에서는 그중 배열을 활용한 이진 트리 표현 방법을 자세히 알
이진 트리란 무엇인가?이진 트리(Binary Tree)는 트리를 구성하는 모든 노드가 최대 두 개까지의 자식 노드만 가질 수 있는 특수한 형태의 트리입니다. 이 자식 노드들은 각각 왼쪽 자식(left child)과 오른쪽 자식(right child)이라고 부릅니다.간단한 이진 트리의 예는 다음과 같습니다.이진 탐색 트리(BST)란?이진 탐색 트리(Binary Search Tree, BST)는 다음과 같은 규칙을 따르는 특수한 트리입니다.왼쪽 자식 노드의 값은 항상 부모 노드의 값보다 작습니다.오른쪽 자식 노드의 값은 항상 부모 노드
확률 변수(Random Variable)란 하나의 과정(process)이 여러 가지 결과를 낼 수 있는 확률을 가질 때, 그 결과값을 나타내는 변수를 말합니다. 예를 들어, 동전을 던졌을 때 앞면 또는 뒷면이라는 결과를 나타내는 변수가 대표적인 확률 변수입니다.그중 이항 확률 변수(Binomial Random Variable)는 어떤 사건에서 특정 결과가 고정된 확률로 발생하는 상황과 관련된 값을 갖는 특수한 유형의 확률 변수입니다.이항 확률 변수의 4가지 필수 조건어떤 변수가 이항 확률 변수가 되기 위해서는 다음 네 가지 조건을
문제 개요이번 프로그래밍 문제에서는 하나의 문자열이 주어지며, 해당 문자열의 문자들로 만들 수 있는 고유한 정렬된 순열(distinct sorted permutations)을 모두 출력해야 합니다. 이 문제의 핵심 조건은 문자열에 동일한 문자가 두 번 이상 포함될 수 있다는 점입니다. 또한 입력으로 주어지는 문자열은 이미 사전순으로 정렬된 상태라고 가정합니다.개념을 더 잘 이해하기 위해 예제를 살펴보겠습니다.입력 : ABD출력 : ABD, ADB, BAD, BDA, DAB, DBA입력 : RSTU출력 : RSTU, RSUT, RTS
문제 개요이 문제에서는 사용자가 지정한 특정 한계 내에 머물 수 있도록 양의 방향(positive) 또는 음의 방향(negative)으로 이동하는 유효한 경로를 찾아야 합니다.구체적으로, 최대 이동 한계값 K와 n개의 양수로 이루어진 배열이 주어집니다. 우리가 해야 할 일은 각 단계에서 이동 값을 더하거나 빼면서 위치가 절대 K 범위를 벗어나지 않도록 하는 이동 방향(양수/음수)의 순서를 구하는 것입니다.입력 및 출력 예시Input : K = 56, 배열 = [25 , 14 , 31 , 16 , 5]Output : positive
이 문제에서는 하나의 숫자가 주어지며, 이 숫자에서 딱 한 자릿수를 제거해야 합니다. 제거한 뒤 새로 만들어진 숫자가 6으로 나누어 떨어지도록 하는 것이 목표이고, 그때 제거한 자릿수의 위치를 출력해야 합니다.예시를 통해 개념을 살펴보겠습니다.입력 : 1324출력 : 4설명 — 4번째 자릿수 4를 제거하면 132가 되고, 132는 6으로 나누어 떨어집니다.즉, 주어진 숫자에서 어느 위치의 자릿수를 제거해야 6의 배수가 되는지 그 위치를 반환하는 것이 핵심입니다.문제 해결의 핵심 원리이 문제를 풀기 위해서는 다음과 같은 수학적 성질을
이진 트리(Binary Tree)란?이진 트리는 모든 노드가 최대 두 개의 자식 노드만 가질 수 있는 특수한 트리 자료구조입니다. 즉, 각 노드는 리프 노드이거나 하나 또는 두 개의 자식 노드를 갖습니다.예시:문제 정의이 문제에서는 하나의 이진 트리와 트리 내의 특정 노드가 주어지며, 해당 노드의 사촌(cousin) 노드를 찾아 출력해야 합니다. 단, 형제(sibling) 노드는 출력 대상에서 제외합니다.예를 들어 아래와 같은 이진 트리가 있다고 가정해 보겠습니다.위 이진 트리에서 찾고자 하는 노드의 사촌 노드는 5입니다.사촌 노드
문제 개요이 문제에서는 하나의 문자열이 주어지며, 문자열을 특정 규칙에 따라 출력해야 합니다. 두 개 이상의 문자가 서로 연속(시퀀스)되어 있다면 같은 줄에 함께 출력하고, 그렇지 않은 경우에는 줄바꿈을 하여 다른 줄에 출력하는 것이 핵심입니다.예제를 통해 개념을 더 쉽게 이해해 보겠습니다.입력 : abcxstk출력 :abcxstk설명abc는 서로 연속된 문자들이므로 한 줄에 함께 출력됩니다. 그다음 문자인 x는 앞의 c와 연속 관계가 아니므로 여기서 줄바꿈이 발생합니다. 다음 문자 s 역시 x와 연속되지 않으므로 새로운 줄에서 시
이 문제에서는 2D 행렬에 여러 개의 직사각형이 서로 동심(同心)을 이루도록 패턴을 출력해야 합니다.먼저 예시를 통해 문제를 자세히 이해해 보겠습니다.n=4일 때 : 4 4 4 4 4 4 4 4 3 3 3 3 3 4 4 3 2 2 2 3 4 4 3 2 1 2 3 4 4 3 2 2 2 3 4 4 3 3 3 3 3 4 4 4 4 4 4 4 4위 예시처럼 정수 값 n을 입력받으면, 가장 바깥쪽부터 안쪽으로 갈수록 값이 1씩 줄어드는 동심 직사각형 패턴을 출력해야 합니다. 일반화된 형태는
문제 개요이 문제에서는 문자 시퀀스로 이루어진 하나의 문자열과 지그재그 패턴의 행 수(n)가 주어집니다. 우리가 해야 할 일은 주어진 문자열을 n개의 행으로 이루어진 지그재그 형태로 배치한 뒤, 각 행을 위에서부터 순서대로 이어 붙인 최종 문자열을 출력하는 것입니다.개념을 더 잘 이해하기 위해 몇 가지 예시를 살펴보겠습니다.예시 1입력 : string = STUVWXYZ, n = 2 출력 : SUWYTVXZ설명 − 2행 지그재그 패턴은 다음과 같습니다.S U W Y T V X
문제 개요이 문제에서는 하나의 이진 트리와 그 안의 두 노드가 주어지며, 루트에서 해당 노드까지 탐색하는 경로에 공통으로 등장하는 모든 노드, 즉 두 노드의 공통 조상(Common Ancestor)들을 출력해야 합니다.이진 트리(Binary Tree)는 모든 노드가 최대 두 개의 자식 노드만 가질 수 있는 특수한 트리 구조입니다. 즉, 각 노드는 리프 노드이거나 한 개 또는 두 개의 자식 노드를 가집니다.예시핵심 용어 정리조상 노드(Ancestor Node): 트리에서 자신보다 하위 레벨에 있는 노드들과 연결된 노드를 의미합니다.공
문제 개요이 문제에서는 두 개의 이진 탐색 트리(Binary Search Tree)가 주어지며, 두 트리에 공통으로 존재하는 노드를 찾아 출력하는 것이 목표입니다.이진 트리(Binary Tree)는 모든 노드가 최대 두 개의 자식 노드를 가질 수 있는 특수한 형태의 트리입니다. 즉, 각 노드는 자식이 없는 리프 노드이거나, 한 개 또는 두 개의 자식 노드를 갖습니다.예시:위 그림처럼 두 개의 이진 트리가 주어졌을 때, 두 트리 모두에서 동일한 값을 가지는 모든 노드를 출력해야 합니다.접근 방법: 보조 스택 활용보조 스택(auxili
문제 개요이 프로그래밍 문제에서는 두 개의 문자열이 주어집니다. 우리가 해야 할 일은 두 문자열에 공통으로 포함된 모든 문자를 찾아 알파벳 순(사전순)으로 출력하는 것입니다. 만약 공통된 문자가 하나도 없다면 NO COMMON CHARACTERS를 출력합니다. 여기서는 문자열이 소문자 알파벳으로만 구성되어 있다고 가정합니다.예시입력 : string1 : adsfhslf string2 : fsrakf출력 : affs설명 − 두 문자열에 공통으로 등장하는 문자는 a, f, s입니다. 각 문자는
이 문제에서는 사용자로부터 문자열 str을 입력받은 뒤, 해당 문자열 안에서 홀수 번 등장한 문자만 골라 출력해야 합니다.문제를 해결하려면 먼저 문자열에 포함된 각 문자가 총 몇 번 나타나는지 빈도를 계산해야 합니다. 그다음, 등장 횟수가 홀수인 문자만 출력하면 됩니다.예시를 통해 문제를 더 자세히 이해해 보겠습니다.입력 : adatesaas 출력 : dte설명 − 각 문자별 등장 빈도는 다음과 같습니다.a4d1t1e1s2이 중 등장 빈도가 홀수인 문자는 d, t, e입니다.알고리즘이제 이 문제를 해결하기 위한 알고리즘을 단계별로
문제 개요이 문제에서는 소문자로만 이루어진 문자열이 하나 주어지며, 문자열에 등장하는 각 문자의 빈도(출현 횟수)를 구해야 합니다. 여기서 중요한 조건은 결과를 문자가 문자열에서 처음 등장한 순서 그대로 출력해야 한다는 점입니다.예시를 통해 문제를 더 자세히 살펴보겠습니다.입력 : jskdk 출력 : j 1 s 1 k 2 d 1설명 − 문자열에서 j, s, d는 각각 1번씩, k는 2번 등장합니다. 따라서 위와 같은 결과가 출력됩니다.접근 방법이 문제를 해결하려면 문자열에 등장하는 각 문자의 출현 횟수를 세어야 합니다. 가장 직관적
이 문제에서는 하나의 연도가 입력으로 주어지며, 해당 연도의 전체 달력(1월~12월)을 콘솔에 출력하는 것이 목표입니다. 연간 달력은 매달의 날짜와 요일을 모두 보여줍니다. 이 글에서는 주어진 연도의 달력을 화면에 출력하는 C++ 프로그램을 단계별로 만들어 보겠습니다. 달력을 만들기 위해서는 크게 두 가지 정보를 계산해야 합니다. 1. 특정 월의 일수 구하기 각 월마다 날짜 수가 다르므로 이를 정확히 반영해야 합니다. 1월, 3월, 5월, 7월, 8월, 10월, 12월은 31일입니다. 2월은 평년에는 28일, 윤년에는 29일입니
이 문제에서는 하나의 표현식(expression)이 주어지며, 우리는 이 표현식의 괄호 번호 시퀀스를 출력해야 합니다. 여는 괄호와 그에 대응하는 닫는 괄호에는 동일한 번호가 부여되며, 괄호가 나타난 순서대로 번호를 매기게 됩니다. 예제를 통해 문제를 더 자세히 살펴보겠습니다. 예시: 입력 : ((()())()) 출력 : 1233442551 설명 − 위 표현식에는 총 5개의 괄호 쌍이 존재하며, 각 괄호가 등장한 순서대로 번호를 부여하여 출력했습니다. 첫 번째 여는 괄호와 마지막 닫는 괄호가 한 쌍을 이루어 같은 번호 1을 갖는 식
이 문제에서는 이진 탐색 트리(Binary Search Tree)와 두 개의 경계값 k1, k2가 주어집니다. 우리가 해야 할 일은 트리에 존재하는 노드 중에서 k1과 k2 사이의 범위에 속하는 모든 값을 찾아 오름차순으로 출력하는 것입니다. 즉, k1보다 크거나 같고 k2보다 작거나 같은 값을 가진 모든 키를 정렬된 순서대로 출력해야 합니다.이진 탐색 트리(BST)란?이진 탐색 트리는 다음 세 가지 성질을 만족하는 트리입니다.왼쪽 서브트리의 모든 노드는 부모 노드보다 작은 값을 가집니다.오른쪽 서브트리의 모든 노드는 부모 노드보다
이 문제에서는 0부터 n 사이의 숫자 중, n의 이진수 표현에 포함된 비트만으로 구성된 모든 숫자, 즉 n의 부분 마스크(submask)에 해당하는 값들을 출력해야 합니다. 어떤 수 i가 n의 부분 마스크라는 것은 i & n == i가 성립한다는 의미입니다.개념을 더 잘 이해하기 위해 예제를 살펴보겠습니다.입력 : N = 4 출력 : 0 4 설명 : 0 & 4 = 0 → 0은 4의 부분 마스크 (포함) 1 & 4 = 0 ≠ 1 (제외) 2 & 4 = 0 ≠ 2 (제외)