분류 전체보기 646

[JAVA] String, StringBuffer, StringBuilder의 차이

String, StringBuffer, StringBuilder의 차이를 정리하면 아래와 같다. String은 불변객체이고 StringBuffer, StringBuilder는 가변객체이다. StringBuffer는 멀티스레드 환경에서 사용되고 StringBuilder는 싱글스레드 환경에서 사용된다. 왜 이런 차이를 보이는 것일까? String이 불변객체인 이유 String이 불변객체인 이유는 JAVA가 문자열 리터럴을 String Constant Pool로 관리하기 때문이다. "안녕하세요", "반갑습니다.", "hello" 처럼 선언된 문자열은 문자열 리터럴로 간주되어 Heap 메모리 안에 생성된 String Constant Pool에 문자열 객체로 등록된다. 스레드A가 "안녕하세요" 문자열 객체를 리터..

JAVA/JAVA Basic 2024.02.23

[PS] BOJ12865 평범한 배낭 ( DP ) with JAVA

12865번: 평범한 배낭 첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000) www.acmicpc.net ◎ 문제풀이 무게 제한이 있는 배낭에 아이템을 넣는 경우, 가치의 최댓값을 구하는 문제이다. 2가지 경우를 생각할 수 있다. 1) 배낭에 넣는 경우 2) 배낭에 넣지 않은 경우 그래서 DFS로 2가지 경우를 완전 탐색해도 될거 같지만, DP로 문제를 풀어보겠다. 무게 제한이 7인 배낭에 아이템1( 무게 6 ), 아이템2( 무게 4) , 아이템3( 무게 3 ), 아이템4( 무게 5 )를 넣으려고 한다..

문제풀이/DP 2024.02.23

[PS] BOJ1446 지름길 ( DP ) With JAVA

1446번: 지름길 첫째 줄에 지름길의 개수 N과 고속도로의 길이 D가 주어진다. N은 12 이하인 양의 정수이고, D는 10,000보다 작거나 같은 자연수이다. 다음 N개의 줄에 지름길의 시작 위치, 도착 위치, 지름길의 길이 www.acmicpc.net ◎ 문제풀이 DP 발상이 가능하면 쉽게 풀 수 있는 문제이다. 어느 한 지점에 도착할 수 있는 경우는 2가지이다. 1) 바로 옆에서 1 이동하는 경우 2) 지름길로 이동하는 경우 지름길로 이동하는 경우는 여러가지가 될 수 있다. 그러므로 여러 가지 경우 중에서 가장 최소인 비용을 기억(메모리제이션) 해놓고 다음 지점의 최소비용 구할 때 사용하면 된다. 0부터 목표지점 D까지 Bottom-Up 방식으로 1씩 dp 값을 구하는 방식으로 문제를 풀면 된다...

문제풀이/DP 2024.02.23

[JAVA] Garbage Collector 동작원리

JAVA와 C, C++의 가장 큰 차이 중 하나는 가비지 컬렉터(Garbage Collector) 이다. JVM의 스레드는 Stack 영역에 독립된 공간을 가지고 Heap 영역은 공유한다. 그래서 가비지 컬렉터 스레드가 Heap 영역의 생성된 객체에 접근하여 제거할 수 있다. 이런 구조는 C/C++도 마찬가지이지만, C/C++은 가비지 컬렉터를 가지고 있지 않다. 왜냐하면 가비지 컬렉터는 치명적인 단점을 가지고 있기 때문이다. 가비지 컬렉터는 Mark-Sweep-Compaction 과정을 거쳐 객체를 제거한다. Mark 전역 메모리 영역, 스택 영역의 참조변수에서 접근할 수 있는 객체는 reachable, 접근할 수 없는 객체는 unreachable로 표시(Mark)한다. Sweep unreachable..

JAVA/JAVA Basic 2024.02.23

[JAVA] JDK 동작원리

JDK( Java Develoment Kit ) JDK는 자바 컴파일 도구(javac) , 자바 실행 환경 ( JRE ) , 자바 실행 머신 ( JVM )이 합쳐진 도구이다. JAVA 언어로 개발하려면 JDK가 필요하지만 단순히 실행만 한다면 JRE만 있어도 된다. 그럼 이제 JDK는 어떻게 동작하는지 구체적으로 알아보자. 객체지향언어, JAVA C,C++은 절차지향언어지만 JAVA는 객체지향언어이다. 절차지향언어는 코드의 '순서'가 중요하므로 코드 전체가 유기적으로 연결되어 있다. 그래서 메모리에 올라갔을 때의 주소도 논리적으로 이미 정해져 있다. 이를 '정적바인딩'이라 부른다. C,C++은 컴파일(compile)을 하면 컴퓨터가 이해할 수 있는 언어인 어셈블리어로 바로 변환된다. 이미 메모리 위치까지..

JAVA/JAVA Basic 2024.02.22

[PS] BOJ1052 물병 ( 비트마스킹 ) With JAVA

https://www.acmicpc.net/problem/1052 1052번: 물병 지민이는 N개의 물병을 가지고 있다. 각 물병에는 물을 무한대로 부을 수 있다. 처음에 모든 물병에는 물이 1리터씩 들어있다. 지민이는 이 물병을 또 다른 장소로 옮기려고 한다. 지민이는 한 번 www.acmicpc.net ◎ 문제풀이 비트마스킹을 발상하면 쉽게 풀 수 있는 문제이다. ( 비스트 마스킹 발상이 어렵다.. ) 지민이가 가지고 있는 N개의 물병은 1L 씩 채워져 있고, 2개씩 합쳐서 K개 이하로 만들 때, 구매해야 하는 물병의 개수를 구하는 문제이다. 예를 들어, 지민이가 물병을 13개 가지고 있고 한번에 2개를 옮길 수 있다고 가정해보자. 물병 13개를 합치면 3개의 물병이 남는다. ( 8L, 4L, 1L ..

[PS] BOJ16508 전공책 ( DFS ) With JAVA

16508번: 전공책 곧 졸업을 앞둔 민호는 대학교 생활 동안 구매만 해놓고 한 번도 펴보지 않은 전공책에 먼지가 쌓여 있는 것을 보고는, 이 책들을 어떻게 처리해야 할지 고민 중이다. 열심히 고민한 끝에 민호는 www.acmicpc.net ◎문제풀이 타이틀을 완성하도록 전공책을 선택할 때 가장 적은 비용을 고르는 문제이다. 나는 DFS 풀이를 발상하기는 했지만 완전탐색을 어떤 방식으로 할지 구현하지 못했다. 그러나 굉장히 단순한 풀이였다. 오히려 너무 단순해서 풀이방식을 떠올리지 못한 것 같다. 전공책을 선택할 수 있고 전공책을 선택 안 할 수도 있다. 선택하는 경우와 안 하는 경우로 DFS 탐색하며, 타이틀을 완성 여부를 체크하고 비용의 최소값을 구하면 된다. ◎ 코드 import java.io.*;..

[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