본문 바로가기

백준8

[Java] Binary Tree Binary Tree는 트리를 통해 데이터를 비선형적으로 관리하는 자료구조이다.앞서 포스팅에서 BST(Binary Search Tree)에 대해서 설명했는데 BST도 이진 트리를 기반한 자료구조이다. 왜 Binary Tree를 사용할까?Tree Post에서도 설명했는데 일반 DAG와 같은 Tree는 효율성 측면에서 너무 부족하다. 그저 Graph와 다름이 없다.그래서 실제 데이터 처리를 하기 위해 Binary Tree로 효율성을 극대화하는 방법을 채택한 것이다. 크게 Binary Tree의 두 종류를 알아보자. 1. 완전 이진 트리2. 편향 트리 이 외에도 많지만 Binary Tree의 핵심을 설명하기에 두 가지가 최고인 것 같다. 위 두가지 개념을 언급한 이유는 BST의 문제점 때문이다.앞서 작성한 B.. 2024. 7. 8.
[Java] Binary Search Tree 앞 포스팅에서 작성한 Tree의 비효율적인 문제를 개선하기 위해 생긴 이진 탐색 트리다.트리는 여러 자식을 가질 수 있지만 이진 검색 트리에서는 Binary Tree의 개념을 사용하기 때문에자식이 Left, Right만 존재한다. 이를 통해 Log_2 (N) 번만에 모든 수행을 끝낼 수 있다. 또, inorder를 수행 시 오름차순 정렬된 결과를 얻을 수 있다. package com.study.datastructrue.nonlinear.binarysearchtree;public class Node { int value; Node left; Node right; public Node(int value) { this.value = value; left = null;.. 2024. 7. 8.
[Java] Tree 트리 자료구조의 종류 : Tree, Binary Tree, Binary Serach Tree, Balanced Binary Serach Tree, Heap, Trie이번 포스트에서는 기본적인 Tree에 대해서만 작성해보자. Tree란 ? Node와 Edge로 구성된 방향이 존재하는 비순환 Graph의 한 종류이다. 그래서 DAG(Directed Acyclic Graphs)라고도 한다.그럼 Graph로 분류하면 되지 왜 Tree냐는 의심을 하게 된다.Tree는 Graph에서 몇가지 특성을 더 가진다. 1. 루트 노드가 하나 존재한다.2. 부모 노드는 하나밖에 존재하지 않는다.3. 노드는 0개 이상의 자식을 가지고 있다.4. 자식이 0개인 경우 단말노드(Leaf Node)라고 한다.5.. 위 특성을 지키는 .. 2024. 7. 7.
[최단경로] Bellman-Ford Algorithm 최단경로 알고리즘package com.study.datastructrue.mst;import java.util.ArrayList;import java.util.Arrays;class Pair { T node; V cost; public Pair(T node, V cost) { this.node = node; this.cost = cost; }}public class BellmanFord { static long[] dist = new long[6]; public static void main(String[] args) { // 집 1, 학교 2, 박물관 3, 영화관 4, 마트 5 ArrayList>> graph = inpu.. 2024. 7. 6.
Java Fast I/O (feat. BOJ, BufferedReader, BufferedWriter) BOJ JAVA 풀이에서 왜 BufferedReader, BufferedWriter 를 사용할까? 사람들은 PS 중 시간 효율을 조금이라도 올리기 위해서 Fast I/O를 사용한다.보통 I/O 속도는 Default I/O, Fast I/O, Custom Fast I/O 가 있다.찐 고수들은 종종 Custom Fast I/O를 사용하는 것을 볼 수 있는데 나는 기본적인 Fast I/O만 사용한다. (초보) Python 에서는 sys.stdin.readline, C++ 에서는 ios_base::sync_with_stdio(0), C에서는 fread() 등Java에서는 BufferedReader 나 BufferedWriter를 사용하는 것을 볼 수 있다. 그럼 왜 사용하는지 한 번 알아보자. BufferedR.. 2024. 7. 6.
백준 - [BOJ 2109] 순회강연 백준 온라인 져지(BOJ)에서 제공 되는 2019번 문제는 그리디(Greedy, 탐욕법) 유형이다. 해당 문제는 code.plus 중급 1/3, 그리디 알고리즘에 게시된 문제이다. 문제 한 저명한 학자에게 n(0 ≤ n ≤ 10,000)개의 대학에서 강연 요청을 해 왔다. 각 대학에서는 d(1 ≤ d ≤ 10,000)일 안에 와서 강연을 해 주면 p(1 ≤ p ≤ 10,000)만큼의 강연료를 지불하겠다고 알려왔다. 각 대학에서 제시하는 d와 p값은 서로 다를 수도 있다. 이 학자는 이를 바탕으로, 가장 많은 돈을 벌 수 있도록 순회강연을 하려 한다. 강연의 특성상, 이 학자는 하루에 최대 한 곳에서만 강연을 할 수 있다. 예를 들어 네 대학에서 제시한 p값이 각각 50, 10, 20, 30이고, d값이 .. 2024. 2. 29.
[이분 탐색] 이분 탐색(Binary Search) 이란 ? 이분 탐색 두 이, 나눌 분을 써서 이분인가? 정답, 이분 탐색은 두개로 나누어서 탐색하는 것이다. 예를 들어, 1부터 10까지 있다고 생각해보자. {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 우리가 8을 찾을 때, 눈으로 바로 보이니까 위치를 파악할 수 있다. 하지만 몇 번째에 있는가? 배열은 0번째부터 시작하니 7번째에 있다는 것을 알 수 있다. 컴퓨터 배열 인덱스 개념이 없는 사람들은 8번째라고 답할 것이다. 즉, O(1) 시간이다. 그럼, {1, 4, 7, 10, 12, 23, 30, 35, 100, 120} 이 있을 때, 35의 위치는? 우리는 앞에서 값을 세어가면서 몇 번째에 있는지 알 것이다. 즉, O(N) 시간이다. 100만개의 숫자가 있다면? 우리는 100만개를 일일이 세다가.. 2024. 2. 1.
백준 - [BOJ 12015] 가장 긴 증가하는 부분 수열 2 백준 온라인 져지(BOJ)에서 제공 되는 12015번 문제는 선행 문제가 있다. 가장 긴 증가하는 부분 수열 나는 위 문제를 먼저 풀어보고 오는 것을 추천한다. 해당 문제는 최장 증가 부분 수열(LIS, Longest Increasing Subsequence)로 유명한 문제이다. 문제 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다. 입력 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤.. 2024. 2. 1.