본문 바로가기

알고리즘146

[Java] 자료구조 - 트리, 이진 트리 [Java] 자료구조 - 트리, 이진 트리 트리는 노드와 간선 (링크)로 만들어진 자료구조다 트리는 사이클이 없고, 계층적 구조를 나타낼 때 사용된다 트리는 모든 노드들이 연결이 되어 있어야 한다 만약 끊기게 된다면 새로운 트리가 만들어지는 것이다 노드가 N개 이면 간선의 갯수는 N-1이다 트리 용어 노드 (Node) : 트리 안의 데이터 또는 값 에지 (Edge) : 노드를 연결하는 링크 루트 노드 (Root) : 트리의 제일 상단에 위치한 하나 밖에 없는 노드 (루트 노드는 부모 노드가 없다) Leaf 노드 : 트리의 제일 하단에 위치한 노드 (자식 노드가 없다) 부모 노드 : A 는 B와 C의 부모 노드다. 연결된 노드의 상위 노드 자식 노드 : B와 C는 A의 자식 노드다. 연결된 노드의 하위 노.. 2023. 6. 22.
[Java] 자료구조 - 힙 [Java] 자료구조 - 힙 힙은 최소힙이 있고, 최대힙이 있다 최소힙은 부모 노드가 항상 자식 노드보다 작은 숫자가 들어간다 즉 최소힙에서는 제일 앞에 있는 숫자, 또는 루트 노드가 제일 작은 숫자로 이루어져 있다 최대힙은 부모 노드가 항상 자식 노드보다 크기가 크다 즉 최대힙에서는 제일 앞에 있는 숫자, 또는 루트 노드가 제일 큰 숫자로 이루어져 있다 힙은 이진 트리로 만들어져 있다 n의 자식 노드를 구할 때에는 (인덱스가 0으로 시작할 때) / 인덱스가 1로 시작할 때에는 왼쪽 노드는 2n + 1 | 2n 오른쪽 노드는 2n + 2 | 2n + 1 부모 노드를 구할 때에는 (인덱스가 0으로 시작할 때) / 인덱스가 1로 시작할 때 (n - 1) / 2 | n / 2 값을 추가하기 (MaxHeap) .. 2023. 6. 18.
[Java] 연결리스트 [Java] 연결리스트 연결리스트 (Linked List) 각 노드에 데이터와, 포인터가 있고, 노드끼리 연결되어 있는 것을 연결리스트라고 한다 여기서 포인터는, 이전 노드 또는 다음 노드와의 연결을 담당한다 제일 처음에 있는 노드를 Head라고 한다 제일 마지막 노드의 포인터는 NULL과 연결이 되어 있다 데이터 추가/삭제는 비교적 쉽게 실행되지만, 인덱스가 없다는 점에서, 데이터를 찾으려면 Head부분부터 순회를 해야 한다 (탐색 속도 저하) 연결 리스트 종류 단일 연결 리스트 (Single Linked List) 노드에 다음 노드가 참조된 제일 간단한 형태의 연결 리스트다 일반적으로 큐를 구현할 때에 사용이 된다 Head가 제일 중요하여, Head를 잃어버린다면, 데이터 전체를 사용을 못 한다 이중.. 2023. 6. 16.
[Java] 해시 테이블 [Java] 해시 테이블 해시 테이블 key와 value를 저장하는 자료구조다 (순서는 중요하지 않다) key와 value를 묶어서 저장한다 Key 값에 Hash Function을 적용하여 배열의 고유한 index를 생성하고, 그 index를 통해 값을 저장 또는 검색을 한다 저장 되는 공간을 bucket이라고도 부른다 해시 충돌 위에서 Key 1을 함수를 통해 나온 값과 Key 2를 해시 함수를 통해 나온 값이 동일하게 나온다면 충돌이 일어난다 개방 주소법과 분리 연결법으로 이러한 충돌을 해결하려고 한다 개방 주소법 hash와 value가 1대1 관계를 유지한다 만약에 충돌이 일어났을 경우, 다른 빈 공간의 hash를 찾고, 저장을 한다 선형 탐사법, 제곱 탐사법, 이중 해싱 등이 개방 주소법으로 분류.. 2023. 6. 15.
[Java] Array [Java] Array 배열 (Array) 여러 개의 동일한 자료형의 데이터를 연속된 공간에 저장하는 자료구조다 각 데이터는 인덱스 번호와 매핑이 되어 있다 인덱스는 0부터 시작하여, 1씩 증가한다 인덱스로 통해 데이터에 접근이 빠르게 가능하다 배열은 데이터를 추가/ 삭제가 어렵고, 애초에 처음 만들 때에 최대 크기를 고정으로 만든다 추가/ 삭제 하기 위해서는, 새로운 배열을 만들어야 한다 배열 길이 : 5 인덱스 0 1 2 3 4 데이터 값 7 8 9 10 11 배열 길이를 설정하고, 안에 있는 값들을 0에서, 원하는 값으로 바꾼다 [0, 0, 0, 0, 0] => [7, 8, 9, 10, 11] import java.util.Arrays; public class MakeArray { public st.. 2023. 6. 14.
20230614 [Java] 문제풀이 20230614 [Java] 문제풀이 [백준] 10818 최소, 최대 배열을 이용하여, 주어진 숫자들의 최소와 최대값을 찾으면 된다 파이썬을 이용할 때에 N개의 입력값을 공백으로 주어진 것을 한번에 리스트로 받아서, for문을 돌며 최소와 최대값을 찾았다 자바 같은 경우 scanner.next(); 를 사용하여 하나의 for문에서, 입력값을 받으면서 최소와 최대값을 찾아냈다 만약에 배열을 출력하고 싶을 때에는 Arrays 를 import 받고, Arrays.toString(배열이름) 으로 출력하면 된다 import java.util.Arrays; import java.util.Scanner; public class Baekjoon10818 { public static void main(String[] a.. 2023. 6. 14.
Java 문제풀이 (Programmers) Java 문제풀이 (Programmers) 같은 숫자는 싫어 배열이 주어진다 배열 안에 숫자가 주어지는데, 연속으로 나열된 같은 숫자는 하나의 숫자로 반환한다 예) [1, 1, 3, 4, 4, 4, 4, 5, 6, 6, 6, 7] => [1, 3, 4, 5, 6, 7] 1, 4, 6은 모두 연속으로 같은 숫자로 나열되어 있어, 하나로 줄인다 간단하게, 먼저 제일 앞에 있는 숫자를 배열에 미리 넣는다 그 다음은 인덱스 1로 시작하여, 전의 숫자와 비교하며, 전의 숫자와 다르면, answer 배열에 해당 숫자를 넣으면 된다 import java.util.*; public class Solution { public ArrayList solution(int []arr) { ArrayList answer = ne.. 2023. 6. 14.
Java 문제풀이 (백준) Java 문제풀이 [백준] 1021번 회전하는 큐 1부터 N번의 숫자가 큐 안에 있다 큐 안에서 꺼내야 할 숫자들이 주어진다 큐에서는 제일 앞에 숫자를 꺼낼 수 있다 제일 앞에, 원하는 숫자가 없으면 왼쪽으로 한칸씩 또는 오른쪽으로 한칸씩 움직여야 한다 Deque를 활용했다 만약 queue 안에, 꺼내야 할 숫자의 인덱스가 queue 안에 있는 숫자를 반으로 나눴을 때, 인덱스가 그 이하일 때에는 왼쪽으로 한칸씩 움직여준다 import java.util.ArrayDeque; import java.util.Scanner; import java.util.Deque; public class Main { static int findIndex(int num, Deque queue) { int index = 0; .. 2023. 6. 13.
[Java] Deque [Java] Deque Deque는 Double-Ended Queue의 줄임말이다 양쪽에서 데이터를 추가, 삭제, 조회를 할 수 있는 자료구조이다 Stack과 Queue를 합친 상태다 Deque의 메서드들 import java.util.*; Deque deque = new LinkedList(); // ========== 삽입 ============= // 덱 앞에 값을 넣는다 // 덱에 용량 제한이 있고, 초과하면 예외를 발생한다 deque.addFirst(value); deque.push(value); // 덱 앞에 값을 넣는다 // 덱에 용량 제한이 있고, 초과하면 false를 반환한다 deque.offerFirst(value); // Deque, 제일 뒤에 값을 넣는다 // 덱에 용량 제한이 있고.. 2023. 6. 13.