전체 글 669

[PS] BOJ1740 거듭제곱 ( 비트마스킹 ) with JAVA

1740번: 거듭제곱 3의 제곱수를 생각하자. 3의 0제곱, 3의 1제곱, 3의 2제곱, ... 은 순서대로 1, 3, 9, 27, ... 이 된다. 이를 바탕으로, 한 개 이상의 서로 다른 3의 제곱수의 합으로 표현되는 수를 생각할 수 있다. 예를 www.acmicpc.net ◎ 문제풀이 3의 거듭제곱의 합 중 N번째로 작은 수를 구하는 문제이다. 비트마스킹을 처음 풀어본 사람이라면 발상이 어려운 문제이다. 대표적인 거듭제곱의 합은 이진수 표현식이다. 십진수를 이진수로 표현하면 2의 거듭제곱의 합으로 표현할 수 있다. 10101 은 2의 0승, 2의2승, 2의 4승의 합이다. 여기서 2를 3으로 바꾸어주면 3의 거듭제곱의 합으로 바꿀 수 있다. 1 : 1 -> 1 2 : 10 -> 3 3 : 11 ->..

[PS] BOJ11501 주식 ( Greedy ) with JAVA

11501번: 주식 입력의 첫 줄에는 테스트케이스 수를 나타내는 자연수 T가 주어진다. 각 테스트케이스 별로 첫 줄에는 날의 수를 나타내는 자연수 N(2 ≤ N ≤ 1,000,000)이 주어지고, 둘째 줄에는 날 별 주가를 나타 www.acmicpc.net ◎ 문제 풀이 산다 2) 판다 3) 아무것도 안한다. 3가지 경우가 있고 목표하는 n 날에 최대이익을 구하는 문제이니, 처음에는 DP를 발상하였다. 그러나 DP로 풀기에는 한계가 있었다. 주식을 하나 팔 수도, 두 개 팔 수도 있었다. DP로 이런 복잡한 경우의 수까지 고려할 수 없었다. 주식은 가장 쌀 때 사서 비쌀때 파는 것이다. 그러므로 그리디 알고리즘이 적합하다. 매일 주가를 기준으로 향후 가장 비싼 주가인 날에 팔면 된다. 주가를 내림차순으로..

문제풀이/Greedy 2024.02.07

[Spring] Bean 생명주기 콜백 ( @PostConstruct, @PreDestory )

Bean은 [ 객체 생성 -> 의존관계 주입 -> 스프링 컨테이너 상주 -> 소멸 ] 의 과정을 거친다. Bean은 스프링이 대신 생성해주므로, 초기화 작업과 종료 작업이 원할히 진행 될 수 있도록, 스프링은 의존관계 주입 된 이후와 소멸되기 직전에 개발자가 특정한 로직을 수행시킬 수 있도록 '콜백(CallBack)'을 제공한다. 초기화 작업은 생성자 로직에 포함시킬 수는 있지만 초기화 과정이 무거운 경우, 객체 생성과 초기화 작업을 분리하는 것이 좋다. 이 경우, Spring이 제공하는 초기화 콜백을 사용하는 것이 좋다. 콜백을 제공하는 방식은 3가지가 있다. 1) InitializingBean, DisposableBean 인터페이스 2) @Bean(initMethod = "init", destroyM..

SPRING/Spring Basic 2024.02.06

[Spring] Bean 자동등록 VS Bean 수동등록

어노테이션으로 스프링 컨테이너에 Bean을 등록하는 방법은 2가지가 있다. 1) 컴포넌트 스캔으로 자동등록 ( @Component, @Service, @Repository ... ) 2) @Configuration 클래스에 수동등록 ( @Bean ) 두 가지 방식은 언제 어떻게 사용하는 것이 좋을까? 1) 업무로직 VS 기술지원 자동방식은 컴포넌트 스캔으로 @Component로 선언된 클래스를 자동으로 Bean으로 등록하니 편하다. 그러나 @Component가 여기저기 퍼져 있어 추적이 힘들다. 수동방식은 @Configuration 클래스를 생성하고 Bean을 하나하나 정의해야 하는 번거로움이 있지만 하나의 클래스에 Bean이 모여 있다보니 관리가 쉽다. 그러므로 자동등록 방식은 업무로직 Bean에 사용..

SPRING/Spring Basic 2024.02.06

[Spring] 스프링 컨테이너와 싱글톤 패턴

싱글톤 패턴 가장 단순한 방식으로 싱글톤 패턴이 적용된 클래스는 다음과 같다. 1. Static 영역에 상수로 인스턴스가 생성되어야 한다. 2. 생성자는 private 접근자로 막아놓는다. 3. 인스턴스는 static 메소드로만 외부 접근을 허용한다. public class Box { // 1. statice 영역에 상수로 객체를 생성한다. private static final Box instance = new Box(); // 2. 생성자는 private 접근자로 막아놓는다. private Box(){ } // 3. 인스턴스는 static 메소드로 조회한다. public static Box getBox(){ return instance; } } 웹에서 싱글톤 객체가 중요한 이유는 수많은 Request가..

SPRING/Spring Basic 2024.02.05

[Spring] 스프링을 사용하는 이유

스프링(Spring)을 사용하는 이유 스프링을 사용하는 이유는 객체(Bean) 생성과 의존관계 주입(DI)을 대신 해주기 때문이다. ( IOC, 제어의 역전 ) 그렇다면, 개발에서 객체생성과 의존관계 주입을 대신 해주는 프레임워크가 필요한 이유는 무엇일까? Spring은 객체지향개발을 도와주는 프레임워크이다. 객체지향개발에서 핵심은 객체 간 결합도를 줄이는 것이다. public class Computer { MouseA mouseA = new MouseA(); // MouseA에 의존, 결합도 증가 public void click(){ mouseA.click(); // MouseA에 의존 } } 컴퓨터 객체가 마우스 객체를 참조하면 클릭 기능을 사용할 수 있다. 그러나 위 코드와 같이, 컴퓨터가 특정 마..

SPRING/Spring Basic 2024.02.01

[Modern JAVA] 클로저(Closure)란?

JAVA에서 클로저(Closure)란? 클로저(Closure)란, 외부 스코프에 선언된 변수를 다른 스코프 영역에서 참조하는 기술이다. 사실, JAVA에서 클로저는 없는 개념이다. 익명함수 클래스나 람다로 인스턴스를 생성할 때, 외부 스코프 변수를 캡처하여 인스턴스 내부에 저장하는 '캡처링' 기술을 두고, 단순히 클로저라 부르는 것이다. 외부에 선언된 변수를 내부에서 사용하니, 마치 클로저 같은 기능을 하기에 붙여진 이름이다. 외부 변수를 캡처하여 인스턴스에 저장하면, 외부에 있는 데이터와 인스턴스에 저장된 데이터는 서로 동일해야 한다. 만약 둘 중 하나가 변경되면 데이터 멱등성이 훼손되기 때문이다. 그래서 JAVA8 이전에는 캡처링 기술이 적용될 변수는 변경되지 못하도록 final 선언을 강제했다. J..

JAVA/Modern JAVA 2024.01.31

[PS] Programmers - 혼자 놀기의 달인 ( DFS )

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr ◎ 문제풀이 상자 안에는 다음 오픈할 상자의 번호가 적혀있는 카드가 들어있다. 임의의 한 상자를 오픈하여 연달아 오픈해서 이미 오픈한 상자를 만날 때까지 오픈한다고 했을 때, 연달아 오픈할 수 있는 상자의 개수가 가장 많은 것과 그 다음 많은 것의 곱을 구하는 문제이다. 문제가 복잡해보이지만 싸이클을 찾는 문제이다. 방향그래프에서 싸이클을 찾는 문제는 DFS 알고리즘을 사용하면 된다. DFS 알고리즘으로 가장 큰 싸이클과 그 다음 싸이클을 찾아서 싸이클 안의 상자수를 곱하면 된다. 주의할 점은 입력으로 주어진..

[Algorithm] DFS, BFS 시간복잡도가 O(N+E)인 이유

노드의 개수가 N이고 간선의 개수가 E일 때,DFS, BFS로 그래프를 완전탐색한다면 시간복잡도가 O(N+E)인 이유는 무엇일까?       DFS, BFS는 완전탐색에 이용된다.반복문으로 모든 노드를 탐색해야 하므로 시간복잡도는 최소 O(N)을 갖는다.  그럼 이제 노드 하나를 방문해보자.여기서 부터 간선의 개수가 연산에 영향을 미친다. DFS는 재귀호출로 인접한 노드에 접근하고BFS는 인접한 노드를 큐에 넣는다.  그러므로 DFS는 인접한 노드의 개수, 즉 간선의 개수에 따라 재귀호출이 반복되고BFS는 인접한 노드의 개수, 즉 간선의 개수에 따라 while문이 반복된다. ( 큐가 빌때 까지 ) 그리고여기서 방문처리가 이루어 진다.  A노드를 방문하면 인접한 노드 B, C를 방문하고 B를 방문하면 인접..

[PS] BOJ17484 진우의 달 여행 ( DP ) with JAVA

17484번: 진우의 달 여행 (Small) 첫줄에 지구와 달 사이 공간을 나타내는 행렬의 크기를 나타내는 N, M (2≤ N, M ≤ 6)이 주어진다. 다음 N줄 동안 각 행렬의 원소 값이 주어진다. 각 행렬의 원소값은 100 이하의 자연수이다. www.acmicpc.net ◎ 문제풀이 진우가 지구에서 달까지 높이마다 정해진 방향으로 이동할 때, 비용의 최솟값을 구하는 문제이다. 처음에는 높이마다 정해진 방향으로 이동하므로, 계층에 따른 모든 경우의 수를 완전탐색하는 DFS 알고리즘을 떠올렸다. 그러다가 문제가 탐색(재귀호출)으로 어떤 조합을 찾기보다는 최적해를 구하는 문제이므로, 메모리제이션을 활용한 DP 풀이가 더 적합하다는 생각으로 바뀌었다. 이동에는 3가지 경우가 있다. 1) 좌측 아래로 대각선..

문제풀이/DP 2024.01.27