문제 개요 이 문제에서는 N개의 정수로 이루어진 배열 arr가 주어지며, arr[i]는 그래프의 (i+1)번째 노드가 가진 값을 나타냅니다. 아울러 M개의 간선 쌍이 제공되고, 각 쌍의 u와 v는 간선으로 서로 연결된 두 노드를 의미합니다. 목표는 무방향 그래프를 이루는 모든 연결된 구성 요소(connected component)에서 각각 최솟값을 찾아, 이 값들을 모두 더한 합계를 구하는 프로그램을 작성하는 것입니다. 다른 어떤 노드와도 연결되지 않은 노드는 노드 하나짜리 독립적인 구성 요소로 간주합니다. 문제 이해를 돕는 예시
이 문제에서는 완전 이진 트리(Complete Binary Tree)가 주어지며, 우리의 목표는 이 트리를 중위 순회(inorder traversal) 방식으로 탐색하면서 각 노드와 그 노드의 미러 이미지(거울상) 노드 값의 합을 구하는 프로그램을 작성하는 것입니다.즉, 왼쪽 서브트리를 중위 순회하면서 각 노드마다 대칭 위치에 있는 노드의 값을 함께 더해야 합니다. 예를 들어 왼쪽 리프 노드를 방문하고 있다면, 그 노드의 미러 이미지인 오른쪽 리프 노드의 값을 더하는 식입니다.핵심 개념 정리완전 이진 트리(Complete Binar
문제 소개이 문제에서는 세 개의 정수 M1, M2, N이 주어집니다. 우리가 작성해야 할 프로그램은 N 미만에 있는 두 수의 배수들의 합을 구하는 것입니다.여기서 말하는 배수란 N보다 작으면서 M1 또는 M2로 나누어 떨어지는 모든 수를 의미합니다.예제로 이해해 보기입력:N = 13, M1 = 4, M2 = 6출력:30설명: 13보다 작은 4와 6의 배수는 4, 6, 8, 12입니다. 이들의 합은 4 + 6 + 8 + 12 = 30입니다.방법 1: 반복문을 이용한 단순 해법가장 간단한 접근 방식은 1부터 N-1까지 반복하면서 M1
이 문제에서는 세 개의 수 N, K, R이 주어집니다. 우리의 목표는 N 이하의 자연수 중에서 K로 나누었을 때 나머지가 R이 되는 수들을 모두 찾아 그 합을 구하는 프로그램을 작성하는 것입니다.즉, 다음 조건을 만족하는 N 이하의 모든 수를 더하면 됩니다.i % K == R문제 이해를 위한 예시입력N = 14, K = 4, R = 1출력28설명 — 14 이하의 수 중에서 4로 나누었을 때 나머지가 1이 되는 수는 1, 5, 9, 13입니다. 이 수들을 모두 더하면 1 + 5 + 9 + 13 = 28이 됩니다.해결 접근 방법이 문제
이 문제에서는 순환 연결 리스트(Circular Linked List)가 주어지며, 우리의 과제는 리스트에 포함된 모든 노드 값의 합을 계산하는 프로그램을 작성하는 것입니다.즉, 연결 리스트를 순회하면서 각 노드의 데이터 값을 모두 더한 뒤 그 결과를 반환하면 됩니다.핵심 개념 정리연결 리스트(Linked List)연결 리스트는 데이터 요소들이 포인터(링크)를 통해 서로 연결된 선형 자료구조입니다. 배열과 달리 크기가 고정되어 있지 않아 삽입과 삭제가 유연합니다.순환 연결 리스트(Circular Linked List)순환 연결 리스
큐(Queue)는 여러 요소를 담는 추상 자료구조입니다. 큐는 FIFO(First In, First Out, 선입선출) 방식으로 동작하며, 즉 가장 먼저 삽입된 요소가 가장 먼저 삭제됩니다.큐는 대표적인 선형(linear) 자료구조이지만, 단순히 배열(array)로 구현하면 몇 가지 문제가 발생할 수 있습니다. 삽입과 삭제 연산이 반복되면서 front(앞)와 rear(뒤) 포인터의 위치가 계속 뒤로 이동하게 되는데, 이때 실제로는 배열에 빈 공간이 남아 있음에도 논리적인 제약 때문에 더 이상 요소를 삽입할 수 없는 것처럼 보이는 상
큐(Queue) 자료구조는 선입선출(FIFO, First In First Out) 방식으로 동작하는 것으로 잘 알려져 있습니다. 하지만 큐에는 몇 가지 변형된 형태가 존재하는데, 대표적인 것이 바로 덱(Deque)과 우선순위 큐(Priority Queue)입니다.덱(Deque)이란?덱은 Double Ended Queue의 줄임말로, 양방향 큐를 의미합니다. 일반적인 큐와 달리 앞(front)과 뒤(back) 양쪽 끝에서 모두 삽입과 삭제가 가능한 구조입니다. 즉, 한 쌍의 포인터는 왼쪽 방향의 데이터를 관리하고, 다른 한 쌍은 오른
배열(array)은 동일한 타입의 데이터를 연속된 메모리 공간에 저장하는 대표적인 자료구조입니다. 이번 글에서는 그중에서도 항상 정렬된 상태를 유지하는 배열, 즉 정렬된 배열(sorted array)의 핵심 개념을 살펴보겠습니다.일반적으로 배열을 사용하려면 데이터를 먼저 정렬해야 하는 경우가 많습니다. 하지만 애초에 정렬된 상태를 유지하도록 배열을 설계하면 매번 정렬 작업을 수행할 필요가 없습니다. 정렬된 배열은 탐색 속도가 빠르다는 장점 때문에 실무에서도 널리 활용됩니다.삽입과 삭제의 핵심 아이디어정렬된 배열에 요소를 삽입할 때는
다차원 배열이란? 배열(array)은 기본적으로 동일한 자료형(homogeneous) 데이터들의 집합으로, 메모리상에 연속된 공간에 순서대로 저장됩니다. 하지만 모든 배열이 반드시 1차원일 필요는 없습니다. 실제 프로그래밍에서는 데이터를 더 직관적으로 표현하기 위해 2차원 또는 그 이상의 다차원 배열(multidimensional array) 형태가 필요한 경우가 많습니다. 예를 들어 행렬, 이미지 픽셀 데이터, 게임 보드 등은 2차원 배열로 표현하면 훨씬 자연스럽게 다룰 수 있습니다. 행 우선(Row-Major)과 열 우선(Co
이번 글에서는 스레드 이진 트리(Threaded Binary Tree) 자료구조와 이를 활용한 중위 순회(Inorder Traversal) 방법을 알아보겠습니다.스레드 이진 트리란?일반적인 이진 트리에서 각 노드는 최대 두 개의 자식 노드를 가질 수 있습니다. 그런데 자식이 하나뿐이거나 아예 없는 경우, 연결 리스트 표현 방식에서는 해당 링크 포인터가 null로 남게 되어 메모리가 낭비됩니다. 스레드 이진 트리는 이렇게 비어 있는 링크 공간을 스레드(thread)로 재활용하여 효율성을 높인 자료구조입니다.즉, 어떤 노드의 왼쪽 또는
큐(queue) 자료구조는 선입선출(FIFO, First In First Out) 방식으로 동작하는 구조로 널리 알려져 있습니다. 큐는 용도에 따라 다양한 변형 형태로 발전했는데, 대표적인 것이 바로 덱(Deque)과 우선순위 큐(Priority Queue)입니다.이번 글에서는 큐의 변형 중 하나인 우선순위 큐에 대해 자세히 살펴보겠습니다. 우선순위 큐에서는 큐에 저장되는 각 요소가 고유한 우선순위를 가지며, 요소를 삽입할 때 반드시 우선순위 값을 함께 지정해야 합니다. 삭제 연산이 수행될 때는 항상 우선순위가 가장 높은 요소가 먼
큐(Queue)는 요소들의 집합을 저장하는 추상 자료구조입니다. 큐는 FIFO(First In, First Out, 선입선출) 방식을 따르며, 가장 먼저 삽입된 요소가 가장 먼저 삭제됩니다.왜 순환 큐가 필요한가?큐는 대표적인 선형 자료구조 중 하나입니다. 하지만 배열로 큐를 구현하면 몇 가지 문제가 발생할 수 있습니다. 삽입과 삭제 연산이 반복되면서 front와 rear 포인터가 계속 뒤로 이동하게 되는데, 어느 순간 실제로는 여유 공간이 남아 있음에도 불구하고 논리적인 제약 때문에 새 요소를 삽입할 수 없는 상태처럼 보이게 됩니
이 글에서는 C++ STL에서 multimap::find() 함수의 동작 방식, 문법, 그리고 실제 활용 예제를 자세히 살펴봅니다. C++ STL에서 멀티맵(Multimap)이란? 멀티맵은 맵(map) 컨테이너와 유사한 연관 컨테이너(associative container)입니다. 키(key)와 매핑된 값(mapped value)의 조합으로 구성된 요소들을 특정 순서에 따라 저장할 수 있습니다. 일반적인 맵과 달리, 멀티맵 컨테이너에는 동일한 키와 연관된 여러 개의 요소가 존재할 수 있다는 점이 특징입니다. 또한 데이터는 항상 내
함수 오버로딩(Function Overloading)은 메서드 오버로딩이라고도 부르며, 객체 지향 프로그래밍에서 널리 활용되는 다형성(Polymorphism) 개념이 제공하는 대표적인 기능입니다. 같은 이름의 함수를 매개변수 구성만 바꿔 여러 번 정의할 수 있어 코드의 가독성과 재사용성을 크게 높여 줍니다. 함수 오버로딩이 성립하려면 다음 조건을 충족해야 합니다. 함수 이름이 서로 같아야 합니다. 컴파일러가 호출 시점에 함수를 구분할 수 있도록 매개변수의 개수, 타입 또는 순서 중 하나 이상이 달라야 합니다. 반환 타입은 오버로딩
문제 개요 두 개의 서로 다른 배열이 주어졌을 때, 무작위로 선택한 하나의 쌍(pair)이 최대 가중치 쌍(maximum weighted pair)일 확률을 구하는 문제입니다. 여기서 쌍은 첫 번째 배열(arr1)의 원소 하나와 두 번째 배열(arr2)의 원소 하나로 구성됩니다. 즉, 프로그램은 첫 번째 원소가 arr1의 최댓값이고 두 번째 원소가 arr2의 최댓값인 경우, 그러니까 최대 가중치 쌍이 뽑힐 확률을 계산해야 합니다. 예제 1 입력 arr1[] = { 2, 23 } arr2[] = { 10, 3, 8 } 출력 proba
문제 개요크기가 n인 배열이 주어졌을 때, 특정 원소 k가 배열에 존재한다면 그 출현 확률을 구하는 것이 이번 글의 목표입니다.배열의 첫 번째 원소부터 n번째 원소까지 전체를 순회하면서 키 k와 일치하는 값이 있는지 탐색합니다. 키가 배열 안에 존재하면 해당 확률을 계산해 출력하고, 존재하지 않는다면 0을 출력하면 됩니다.입력 예시arr[] = { 1, 2, 3, 4, 5, 6 } K = 5출력 예시배열에서 키 5의 확률 : 0.166입력 예시 2arr[] = { 1, 2, 3, 4, 5, 6, 7 } K = 8출력 예시 2배열에서
두 명의 선수 A와 B가 경기에서 승리하기 위해 페널티 킥에 도전하는 상황을 가정해 보겠습니다. 네 개의 정수 변수 a, b, c, d가 주어지며, A가 먼저 페널티를 성공시킬 확률은 a/b, B가 먼저 페널티를 성공시킬 확률은 c/d로 주어집니다.페널티를 먼저 성공시키는 선수가 경기에서 승리하게 되며, 문제의 요구 사항에 따라 프로그램은 A가 경기에서 승리할 확률을 계산해야 합니다.입력 예시a = 10, b = 20, c = 30, d = 40출력 예시probability is 0.5333입력 예시a = 1, b = 2, c =
데이터가 문자열 형식으로 저장된 트리가 주어졌을 때, 이진 트리의 k번째 레벨에 있는 노드들의 곱을 구하는 문제입니다. 트리의 각 노드는 세 가지 요소로 구성됩니다. 즉, 데이터 부분, 왼쪽 서브트리를 가리키는 왼쪽 포인터, 그리고 오른쪽 서브트리를 가리키는 오른쪽 포인터입니다.이진 트리의 레벨은 0부터 시작하며, 임의의 양수 n까지 확장될 수 있습니다. 따라서 레벨 k가 입력으로 주어지면 프로그램은 해당 k 레벨에 존재하는 모든 노드 값의 곱을 계산해야 합니다.문제 이해하기예를 들어, 아래와 같은 이진 트리에서 k = 2라고 가정
노드들로 구성된 이진 트리가 주어졌을 때, 이 트리에 포함된 모든 잎 노드(리프 노드) 값의 곱을 구하는 것이 목표입니다.잎 노드란 자식 노드를 하나도 가지고 있지 않은 말단 노드를 의미합니다. 트리에서 루트 노드는 항상 부모 노드 역할만 수행하며, 그 외의 노드들은 부모 노드이거나 자식 노드가 될 수 있습니다. 따라서 왼쪽 포인터와 오른쪽 포인터가 모두 NULL인 노드가 바로 잎 노드입니다.문제 예시입력:잎 노드: 23, 34, 25곱: 23 × 34 × 25 = 19550트리를 순회하여 자식이 없는 노드인 23, 34, 25를
노드들로 구성된 이진 트리가 주어졌을 때, 해당 트리의 모든 노드 값을 곱한 결과를 구하는 것이 이 글의 목표입니다. 이진 트리에는 트리 내 모든 노드의 시작점 역할을 하는 루트(root) 노드가 존재합니다. 하나의 노드는 데이터 영역과, 왼쪽 하위 트리를 형성하는 왼쪽 포인터(left), 오른쪽 하위 트리를 형성하는 오른쪽 포인터(right)로 구성됩니다. 따라서 트리를 순회할 때는 임시 포인터를 활용해 왼쪽 포인터를 따라 왼쪽 하위 트리를 탐색하거나, 오른쪽 포인터를 따라 오른쪽 하위 트리를 탐색하는 방식으로 진행할 수 있습니