본문 바로가기

전체 글

백준 - 24391 귀찮은 해강이(Java) https://www.acmicpc.net/problem/24391 24391번: 귀찮은 해강이 첫째 줄에 강의의 개수 N(1 ≤ N ≤ 105)과 연결되어 있는 건물의 쌍의 개수 M(0 ≤ M ≤ 105)이 공백으로 구분되어 주어진다. 두 번째 줄부터는 M줄에 걸쳐 i와 j(1 ≤ i, j ≤ N)가 주어진다. 이는 i번 건 www.acmicpc.net 유니온-파인드(Union-Find) 문제입니다. 혹시 유니온 파인드를 잘 모르시는 분은 https://ksb-dev.tistory.com/114 에 정리된 것이 있으니 읽어보시기 바랍니다. 결국 문제에서 묻는 질문은 '건물들이 연결되어 있는가?'입니다. 유니온-파인드를 사용하면 연결 된 것은 하나의 집합으로 묶을 수 있습니다. 연결 건물 정보를 받아 유.. 더보기
프로그래머스 - 삼각 달팽이(Java) 단순 구현 문제입니다. 그림과 같이 값을 채우기 위해서는 세 번의 연산이 필요합니다. 세로 N번 가로 N-1번 대각선 N-2번 세로, 가로 대각선을 채울 때 마다 N은 3이 줄어들어 줄어든 N을 사용하여 내부를 채우면 됩니다. [구현 코드] import java.util.ArrayList; import java.util.Arrays; import java.util.List; class Solution { private static int[][] map; private static int num, row, col; public static int[] solution(int n) { map = new int[n + 1][n + 1]; row = -1; col = 0; for (int i = n; i > 0;.. 더보기
토비의 스프링 - 6.4 스프링의 프록시 팩토리 빈 6.4.1 ProxyFactoryBean 스프링에서 제공하는 깔끔한 부가기능 추가를 위한 클래스 JDK에서 제공하는 다이내믹 프록시 단점 해결 서비스 추상화와 동일하게 스프링은 일관된 방법으로 프록시를 만들 수 있는 추상 레이어임 스프링의 ProxyFactoryBean는 프록시를 생성해서 빈 오브젝트로 등록하게 하는 팩토리 빈임 ProxyFactoryBean는 순수하게 프록시 생성 작업만 담당하기 때문에, 부가기능은 어드바이스라 불리면서 MethodInterceptor를 구현한 별도의 빈에 둘 수있음 즉, ProxyFactoryBean가 생성하는 프록시의 부가기능은 MethodInterceptor를 구현해서 만듦 MethodInterceptor는 InvocationHandler와 비슷하지만 두 가지 다른.. 더보기
토비의 스프링 - 6.3 다이내믹 프록시와 팩토리 빈 6.3.1 프록시 전략 패턴 적용을 통한 부가기능 구현의 분리 부가적 기능을 위임을 통해 분리 기능을 사용하는 코드는 핵심 코드와 함께 남아 있음 부가기능과 핵심기능의 분리 트랜잭션은 비즈니스 로직과 성격이 다르기 때문에 분리 가능 트랜잭션을 UserServiceTx로 분리하여 UserServiceImpl에는 비즈니스 로직만 남음 핵심기능 인터페이스 적용 부가기능과 핵심기능을 같은 인터페이스를 구현하게 만듦 클라이언트는 인터페이스를 통해서만 핵심기능 사용 부가기능 코드를 먼저 거쳐 비즈니스 로직 부분을 핵심기능에 위임함 실제 대상인 것처럼 위장해서 클라이언트의 요청을 받기 때문에 프록시(Proxy)라도 부름 6.3.2 프록시 패턴 설명 부가기능과 핵심기능은 같은 인터페이스를 구현 프록시를 통해 최종적으로.. 더보기
프로그래머스 - 풍선 터트리기(Java) 단순 구현 문제입니다. dfs로 문제를 해결하기에는 n의 범위가 1,000,000이기 때문에 불가능합니다. 하나의 아이디어가 필요합니다. 문제의 조건은 크게 두 가지입니다. 인접한 두 풍선 중 기본적으로 큰 풍선을 터트린다. 단 한 번 작은 풍선을 터트릴 수 있다. 1 ~ n개 사이의 특정 위치를 i라 하겠습니다. 이 i를 살릴 수 있는 방법을 구해야 합니다. 문제에 의해 기본적으로 큰 것을 터트려야 합니다. 그렇다면 좌측과 우측 양쪽 끝에서 부터 시작하여 최소를 저장해 비교하면 어떨까요? 다시말해, 좌측에서 i번째 까지 최소를 구하고 우측에서 i번째까지 최소를 구해서 비교하는 것입니다. 즉, 현재 위치, 좌측 최소, 우측 최소 세 가지를 한 번에 비교하는 것입니다. 단 한번만 작은 풍선을 터트릴 수 있.. 더보기
토비의 스프링 - 6.2 고립된 단위 테스트 6.2.1 복잡한 의존관계 속의 테스트 작은 단위로 테스트 할 수록 논리적 오류를 찾기 쉬움 하지만, 다른 오브젝트와 환경에 의존하고 있다면 작은 단위 테스트의 장점을 얻기 힘듦 UserService는 사용자 관리 로직만 갖는 아주 단순한 비즈니스 로직임에도, 세 가지의 의존 관계를 가지고 있음 UserService는 UserDao, TransactionManager, MailSender 의존을 가지고 있음 문제는 세 가지 의존 오브젝트들이 자신의 코드만 실행되지 않음 Jdbc를 이용해 UserDao를 구현한 UserDaoJdbc는 DataSource의 구현 클래스, DB 드라이버, DB 서버까지의 네트워크 통신, DB 테이블 등에 모두 의존함 따라서, UserService를 테스트 하지만 그 뒤의 오브.. 더보기
토비의 스프링 - 6.1 트랜젝션 코드의 분리 6.1.1 AOP(Aspect Oriented Programming) AOP는 IoC/DI, 서비스 추상화와 더불어 스프링의 3대 기반기술임 AOP는 스프링의 기술 중에서 가장 난해한 용어와 개념을 가진 기술임 AOP는 주로 선언적 트랜잭션 기능에 많이 사용됨 서비스 추상화를 통해 근본적 문제를 해결 했지만, AOP로 더욱 세련되고 깔끔한 방식으로 바꿀 수 있음 AOP 등장 배경, 스프링이 AOP를 도입한 이유, AOP 적용의 장점 등을 공부할 것임 6.1.2 메소드 분리 서비스 추상화 기법을 통해 트랜잭션의 근본적 문제를 해결했지만 UserService에는 트랜잭션 로직과 비즈니스 로직이 같이 존재함 스프링이 제공하는 트랜잭션 인터페이스 PlatformTransactionManager를 사용했지만, 메.. 더보기
프로그래머스 - 숫자 게임(Java) 힙(Heap) 구조를 이용한 구현 문제입니다. 이 문제를 풀기 위해서는 한 가지의 아이디어가 필요합니다. 'A의 큰 숫자를 B의 큰 숫자로 대응시켜야 한다.' A에는 {5, 1, 3, 7}가 있고, B에는 {1, 1, 6, 8}이 있다고 가정하겠습니다. A의 {5}는 B의 {6}과 {8}로 해결할 수 있습니다. B의 {8}로 A의 {5}를 이기게 되면, B의 {6}은 {3}을 이겨 최대가 2가 됩니다. 하지만, B이 {8} A의 {7}을 이기면 최대가 3이 됩니다. 배열을 정렬하게 된다면 일반적으로 O(nlogn)의 시간이 걸리게 됩니다. 하지만, 단순히 힙 구조에 넣게 되면 배열 정렬하면서 O(N)의 시간으로 정렬된 값들을 얻을 수 있습니다. 단, 이 문제의 특성상 거의 모든 원소의 값을 크기 순으로 .. 더보기