전체 글

toString을 항상 재정의하라 - [3장. 모든 객체의 공통 메서드(아이템12)]
1. toString을 재정의 해야 하는 이유 🧃 1. Object의 toString 메서드의 기본 형식 Object의 기본 toString 메서드는 '클래스이름@16진수로 표시한 해쉬코드'를 반환해 준다. test.Test@15db9742이 하나의 예시이다. 이는 우리가 작성한 클래스에서 toString으로 반환받을 적절한 값의 형태가 아니다. 또한, Object.class에 정의된 toString을 살펴보면 아래의 내용을 확인할 수 있다. The result should be a concise but informative representation that is easy for a person to read. 간결하면서 사람이 읽기 쉬운 형태의 유익한 정보를 반환해라 It is recommended ..

PRIM 알고리즘
최소신장트리를 만드는 두 번째 방법인 PRIM 알고리즘에 대해서 알아보자. (첫 번째 방법으로는 KRUSKAL 알고리즘이 있었다.) 1. PRIM 알고리즘 👓 1. 기본 개념 그리디 방식을 이용하여 최소 신장 트리를 찾는 방식 시작 정점에서부터 출발하여 신장트리 집합을 단계적으로 만들어 나가는 방식 2. 동작 방식 그래프에서 하나의 정점을 선택하여 트리를 만든다. 트리와 연결되어 있지만 아직 선택되지 않은 정점들 중에서 간선의 가중치가 가장 낮은 정점을 트리에 포함시킨다. 트리가 N-1의 간선을 가질 때까지 2번을 반복한다. 2. 구현 (JAVA) 🤿 구현 방식으로는 아래의 2가지 방법이 있다. 반복문을 통해 다음 정점을 찾는 방식 PriorityQueue를 이용해 다음 정점을 찾는 방식 위의 예시를 통..

KRUSKAL 알고리즘
1. 기본 개념 🧪 1. 신장 트리 (Spanning Tree) n개의 정점을 가지는 그래프에서 n개의 정점을 모두 연결할 수 있는 n-1개의 간선으로 이루어진 트리 (간선은 n-1개 이상일 수 있다.) 물론 n-1개 이상의 간선을 가져도 신장 트리가 될 수 있다. 2. 최소 신장 트리(Minimum Spanning Tree) 무향 가중치 그래프에서 가중치의 합이 가장 작은 신장 트리를 최소 신장 트리라고 한다. 2. KRUSKAL 알고리즘 🧫 1. 기본개념 그리디 방식을 이용하여 최소 신장 트리를 찾는 방식 그리디한 방식 자체가 항상 최적의 해답을 제공한다는 보장은 없지만, KRUSKAL 알고리즘에서는 최적의 해답을 제공하는 것으로 증명되어있다. 2. 동작 방식 모든 간선들을 가중치에 따라 오름차순으로..

서로소 집합(Disjoint-sets)
1. 서로소 집합의 개념 및 이해 🛺 1. 개념 서로소 집합이란 서로 중복 포함된 원소가 없는 집합을 말한다. 교집합이 없는(null) 집합이다. 2. 대표자 집합에 속한 하나의 특정 멤버를 대표자라고 한다. 이는 집합을 구분하기 위해 사용된다. 3. 예시 빠른 이해를 위해 간단한 예시를 살펴보자. 5명의 학생(A, B, C, D, E)이 있다고 하자. {A}, {B}, {C}, {D}, {E} 아래와 같은 친구 관계가 있다고 하자. A - B B - C D - E 친구 관계를 통해서 2개의 집합을 만들 수 있다. G1 = {A, B, C} G2 = {D, E} 서로 중복 포함된 원소가 없으므로 이는 서로소 집합이다. (한 사람이 분신술을 써서 양쪽 집합에 포함될 수 없으므로 당연한 결과이다.) 2. 표..

BOJ 14865 - 곡선 자르기 [JAVA]
14865번: 곡선 자르기 컴퓨터 그래픽 캔버스는 컴퓨터 화면에서 그림을 그릴 수 있는 직사각형 영역을 말한다. 캔버스는 2차원 좌표 평면처럼 각 점의 위치를 좌표로 표시한다. 캔버스의 정중앙 점이 원점 (0,0)이고, www.acmicpc.net 해당 문제는 스택(괄호 문제)을 이용하는 것이다. '스택'이라는 아이디어를 떠올리기 전까지 정말 많은 시도를 했을 것이다. 필자도 여러 방법(y축을 기준으로 상승 또는 하강하는 경우, 덮개를 고려하는 경우)을 시도해 보았다. 하지만, 예외 케이스들이 너무 많아서 스택이 아닌 다른 방법을 사용하는 것에는 많은 어려움이 있을 거라고 생각한다. 우선 감을 빨리 잡기 위하여 '곡선 자르기' 문제와 괄호 문제가 어떻게 같은지 그림을 통해서 알아보자. 하나의 봉우리에 대..

Parsing(파싱) - CSV, XML, JSON
이번 글에서는 데이터의 종류, Parsing(파싱) & Parser(파서), Parsing의 실제 사용 방법을 살펴보도록 하자. 1. CSV, XML, JSON 🌞 (1) CSV (Comma Separated Value) 🌱 CSV는 몇 가지 필드를 쉼표(,)로 구분한 텍스트 데이터 및 텍스트 파일이다. name,age,visitTime 최하늘,23,2023-01-28 이구름,15,2023-01-29 김산,32,2023-01-30 (2) XML (eXtensible Markup Language) 🌳 XML은 HTML과 매우 비슷한 문자 기반의 마크업 언어(text-based markup language)이다. 태그를 통해 데이터 형식을 정의한다. XML 태그는 HTML 태그처럼 미리 정의되어 있지 않고,..

입출력(I/O)(2) - 직렬화(Serialization)
1. 직렬화 개념 🏓 직렬화(Serialization)란 객체를 데이터 스트림으로 만드는 것을 말한다. 즉, 현재 데이터(structure, object)의 상태를 영속적으로 저장하거나 다른 환경으로 전달(네트워크 통신 등) 하기 위해 어떠한 정해진 포맷으로 변환하는 과정이다. 변환된 데이터를 다시 원래 데이터로 변환하는 과정은 역직렬화(Deserialization)이라고 한다. // 직렬화를 하지 않은 경우 public class User{ private String name; private String id; String password; public User(String name, String id, String password) { this.name = name; this.id = id; this..

입출력(I/O)(1) - 노드 스트림, 보조 스트림
구체적인 내용에 들어가기에 앞서 기본적인 단어 3개를 살펴보자. I/O란 Input/Ouput의 약자로 입력과 출력을 나타낸다. 노드(Node)란 '데이터의 출발지와 목적지' 또는 '입력과 출력의 끝단'이다. 데이터를 전달하기 데이터를 운반하는 데 사용되는 연결 통로가 필요한데 그것이 스트림(Stream)이다. 이번 주제에서는 입출력을 가능하게 하는 노드 스트림, 이를 도와주는 보조 스트림, 그리고 직렬화(Serialization)를 알아보자. 1. 노드 스트림 🛴 노드 스트림이란 노드에 연결된 스트림이다. 다양한 노드 스트림들이 있는데 3가지 조건으로 분류를 하여 그것에 해당하는 노드스트림을 사용하면 된다. 3가지 분류는 아래와 같다. 데이터 타입 전송할 데이터 타입이 Byte인지 아니면 Char인지 ..

람다식(Lambda Expression) - (2)
앞에 글에 이어서 람다식을 살펴보자. 이번에는 java.util.function 패키지의 함수형 인터페이스와 메서드 참조에 대해서 알아볼 것이다. 1. 함수형 인터페이스 🍛 함수형 인터페이스에 대한 설명이 필요하다면 앞의 글을 참고하기를 바란다. 여기서는 java.util.function에서 제공하는 함수형 인터페이스의 종류와 사용법에 대해서만 알아보고자 한다. 함수형 인터페이스 메서드 설명 Runnable void run() 매개변수 X, 반환값 X Supplier T get() 매개변수 X, 반환값 O Consumer void accept(T t) 매개변수 O, 반환값 X Function R apply(T t) 매개변수 O, 반환값 O Predicate boolean test(T t) 매개변수 O, ..

람다식(Lambda Expression) - (1)
JDK1.8부터 람다식(Lambda Expression)을 사용할 수 있게 되었다. 이것은 자바의 매우 큰 변화 중에 하나이다. 이번 글을 통해 '람다식의 개념', '람다식 작성법', '함수형 인터페이스'를 알아보자. 1. 람다식(Lambda Expression) 🍣 람다식(Lambda Expression)은 메서드를 하나의 '식(expression)'으로 표현한 것이다. 이를 통해 자바는 객체지향언어인 동시에 함수형 언어가 되었다. 아래는 명령형 프로그래밍과 선언형 프로그래밍에 대한 간략한 내용이다. 이를 알고 람다식을 배운다면 람다식의 내용이 더 쉽게 다가올 것이다. 명령형 프로그래밍 (⊃ 객체지향 프로그래밍) : 클래스에서 메서드를 정의하고, 필요할 때 그 메서드를 호출하는 명령을 하여 동작하는 것..

Comparable과 Comparator
public class Main { public static void main(String[] args) { char[] chArr = {'E', 'D', 'C', 'B', 'A'}; System.out.println("정렬 전 : " + Arrays.toString(chArr)); Arrays.sort(chArr); System.out.println("정렬 후 : " + Arrays.toString(chArr)); } } // 정렬 전 : [E, D, C, B, A] // 정렬 후 : [A, B, C, D, E] Arrays.sort를 이용하면 위와 같이 정렬을 할 수 있다. 정렬이 가능한 이유는 Comparable을 구현했기 때문이다. 이번 글에서는 'Comparable과 Comparator의 개념'..

예외처리(Exception Handling) - (2)
1. try-with-resources문 ⛳ try (SomeResource resource = getResource()) { use(resource); } catch(Exception e) { ... } JDK1.7부터 try-with-resources문이 추가되었다. try-with-resources문의 괄호() 안에 객체를 생성하는 문장을 넣으면, 이 객체는 따로 close()를 호출하지 않아도 try블럭을 벗어나는 순간 자동적으로 close()가 호출된다. 그리고 catch블럭 또는 finally블럭이 따라오게 된다. 이때 try-with-resources를 통해 자동으로 객체의 close()가 호출될 수 있으려면 클래스가 AutoCloseable이라는 인터페이스를 구현한 것이어야 한다. 또한, ..