본문 바로가기

분류 전체보기121

[구름톤 챌린지] 작은 노드 풀이 과정 먼저 노드들의 연결 정보를 담기 위해서 ArrayList[] graph를 선언하였다. 그리고 노드 개수만큼 반복하여 해당 인덱스마다 해당 노드가 연결된 정보를 담을 수 있게 new ArrayList();를 통해 할당하였다. 그리고 visited를 통해서는 해당 노드를 방문했을 경우 다음 노드를 방문할 수 있는 용도로 정의하였다. 그 후에 간선의 개수만큼 순회하며 입력된 간선의 정보를 통해 양 노드가 서로 연결되어 있기 때문에 양 노드 모두 해당 인덱스에 대한 ArrayList에 추가하도록 작성했다. 문제 조건 중에 방문할 수 있으면서 번호가 가장 작은 노드로 이동하기 때문에 해당 노드에 연결된 노드들을 오름차순으로 정렬했다. DFS 방식을 사용하여 시작 노드로부터 연결된 노드들을 순회하면 위에.. 2023. 9. 1.
[구름톤 챌린지] 통증 (2) 풀이 과정 먼저, 이 문제는 Dynamic Programming으로 해결할 수 있다. 예를 들어, 3, 4, 5 힐 아이템이 있다고 가정하고, 9라는 통증을 0으로 만들어야하는 상황을 가정해보자. 그 때, 3원의 동전으로 통증 3을 해결하는 방법은 1가지이고, 통증 6을 해결하는 방법은 통증 (6 - 3)을 해결하는 경우의 수 + 1 즉, 2가 된다. 그리고 마지막 통증 9를 해결하기 위해서는 통증 (9 - 3)을 해결하는 방법 + 1이 된다. 다시 4원과 5원을 봤을때 통증 4를 해결하는 방법, 통증 5를 해결하는 방법은 각각 1가지가 되고, 통증 9를 해결하는 방법은 통증 (9 - 4)를 해결하는 방법 + 1(본인) 즉, 2가지가 필요하다. 따라서 정답은 2가 된다. 이를 순서대로 다시 작성해보자. .. 2023. 8. 31.
Hash란? Java로 HashTable 구현하기 Hash Java의 hashCode 메서드를 공부하던 중 깊이있게 이해하기 위해서는 먼저 Hash에 대해 이해할 필요성을 느끼고 Hash에 대해서 먼저 정리해보기로 한다. 그러면 Hash란 무엇일까? Hash는 다양한 길이를 가진 데이터를 고정된 길이를 가진 데이터로 매핑(mapping)한 값을 말한다. 해시 함수(Hash Function)이란? 해시 함수는 임의의 길이를 갖는 데이터를 고정된 길이의 데이터로 변환시켜주는 함수를 말한다. 해싱 함수의 특징 중 하나로는 결과값이 정해진 길이로 나오는데 1글자를 입력하거나 100글자 이상을 입력하더라도 똑같은 정해진 길이의 결과값을 반환한다. 그렇다보니 입력값이 다른데 같은 출력값이 나오는 해시 충돌이 발생할 가능성이 아주 낮지만 있다. 따라서 해시 충돌을 .. 2023. 8. 31.
타입 안전 이종 컨테이너와 수퍼 타입 토큰 타입 안전 이종 컨테이너 타입 안전 이종 컨테이너는 한 타입의 객체만 담을 수 있는 컨테이너가 아닌 여러 다른 타입(이종)을 담을 수 있는 타입 안전한 컨테이너를 말한다. 이렇게 하면 제네릭 타입 시스템이 값의 타입이 키와 같음을 보장해주는데, 이러한 설계 방식을 타입 안전 이종 컨테이너 패턴이라고 한다. 일반적으로 사용하는 제네릭의 한계 public class Favorites { List value; public static void main(String[] args) { Favorites names = new Favorites(); names.value.add("oneny"); names.value.add("twony"); Favorites numbers = new Favorites(); } } 제.. 2023. 8. 27.
프로세스 스케줄 프로세스 스케줄러 리눅스 커널에는 프로세스 스케줄러(Process Scheduler, 줄여서 스케줄러) 기능이 있는데 이 기능은 여러 개의 프로세스를 동시에 동작시키는 것처럼 보이게 한다. 이러한 스케줄러의 동작 방식은 다음과 같다. 하나의 CPU는 동시에 하나의 프로세스만 처리할 수 있다. 하나의 CPU에 여러 개의 프로세스를 실행해야 할 때는 각 프로세스를 적절한 시간으로 쪼개서(타임 슬라이스) 번갈아 처리한다. 프로세스 스케줄러 확인을 위한 테스트 프로그램 구현 테스트 프로그램 코드 더보기 // 필요한 헤더파일 및 상수 정의 #include #include #include #include #include #include #include #include #define NLOOP_FOR_ESTIMATI.. 2023. 8. 22.
애노테이션 프로세서 애노테이션 프로세서 일반적으로 애노테이션에 대한 코드를 검사, 수정 또는 생성하는데 사용된다. 본질적으로 애노테이션 프로세서는 java 컴파일러의 플러그인의 일종이다. 애노테이션 프로세서를 적재적소에 잘 사용한다면 개발자의 코드를 단순화할 수 있다. 애노테이션 프로세스의 대표적인 예로 Lombok이 있다. Lombok은 @Getter, @Setter, @Builder 등의 애노테이션과 애노테이션 프로세서를 제공하여 표준적으로 작성해야할 코드를 개발자 대신 생성해주는 라이브러리이다. Lombok(롬복)은 어떻게 동작하는 걸까? @Getter @EqualsAndHashCode @RequiredArgsConstructor public class Member { private final String name; .. 2023. 8. 18.
Proxy 패턴과 JDK Dynamic Proxy, CGLIB Proxy 패턴 특정 객체에 대한 접근을 제어하거나 기능을 추가할 수 있는 패턴이다. 즉, 클라이언트가 사용하려고 하는 대상을 실제 대상인 것처럼 위장해서 클라이언트의 요청을 받는다. 프록시 패턴의 장점에는 초기화 지연, 접근 제어, 로깅, 캐싱 등 다양하게 응용해 사용할 수 있다는 것이다. Proxy 패턴 구성 요소 위 그림은 인터페이스와 인터페이스 구현체를 사용하는 구조를 설명하는 그림이다(위 그림과 다르게 인터페이스가 아닌 클래스 상속을 사용할 수도 있다). 인터페이스 기반의 Proxy 패턴은 특징으로는 본인의 타입을 참조하는 필드를 하나 가지고 있다. 이 필드를 가지고 있는 이유는 RealSubject를 참조하기 위함이다. 해당 필드의 operation() 메서드는 RealSubject의 메서드를.. 2023. 8. 17.
Reflection과 Annotation을 이해하고 DI 컨테이너 만들기 Reflection JVM은 클래스 정보를 클래스 로더를 통해 읽어와서 해당 정보를 JVM 메모리에 저장한다. 그렇게 저장된 클래스에 대한 정보가 마치 거울에 투영된 모습과 닮아있어, 리플렉션이라는 이름을 가지게 되었다. 리플렉션을 사용하면 생성자, 메서드, 필드 등 클래스에 대한 정보를 아주 자세히 알아낼 수 있다. 리플렉션을 사용한 애노테이션은 여러 라이브러리, 프레임워크에서 많이 사용된다. 스프링에서는 의존성 주입, MVC 뷰에서 넘어온 데이터를 객체에 바인할 때, 하이버네이트에서는 @Entity 클래스에 Setter가 없다면 리플렉션을 사용한다. 그리고 클래스 로더에 대한 개념에 대해 어느정도 이해할 필요가 있어 아래 블로그 글을 정리하였다. JVM 메모리 구조 JVM 성능에 관심이 있다면 기본적.. 2023. 8. 13.
try-finally 보다는 try-with-resources를 사용하자 try-finally Java를 처음 배울때 finally 블록은 예외가 발생하든 발생하지않든 항상 실행이 되기 때문에 finally 블록에서 자원을 반납하라고 배웠다. 하지만 Java 8 이상부터는 try-finally는 더이상 최선의 방법이 아니다. try-with-resources를 써야한다. try-finally 예시코드 public class Copy { private static final int BUFFER_SIZE = 8 * 1024; static void copy(String src, String dst) throws IOException { FileInputStream in = new FileInputStream(src); try { FileOutputStream out = new Fi.. 2023. 8. 10.