본문 바로가기

분류 전체보기

(276)
이코테 - 병사 배치하기 with JAVA 해결 전투력이 높은 순서대로 배열을 설정하기 위해 몇몇의 병사들을 제거하여 이를 설정하려고 하는데, 최대한 병사를 적게 줄여야한다. 전투력이 15 11 4 8 5 2 4라고 가정하자. 뒤에서부터 DP를 적용한다. - 전투력이 4인 병사에서 살릴 수 있는 병사의 수는 1이다. - 전투력이 2인 병사에서 4보다 작으므로 살릴 수 있는 병사의 수는 1이다. - 전투력이 5인 병사에서 2보다 크므로 병사 2에서 살릴수 있는 병수+1이고 마찬가지로 4에도 적용된다. 즉, 로직을 보면 뒤부터 진행을 하는데 이미 처리한 병사들 중 현재 전투력보다 작다면 해당 병사가 갖는 최대 병사+1 처리를 해주면 된다. 코드 import java.util.*; public class Q4 { public static void ma..
Effective JAVA - Item9 : try-finally 보다는 try-with-resources를 사용하라. 기본적으로 자바에서는 close 메서드를 통해 작업 완료시 닫아줘야하는 클래스 인스턴스들이 존재한다. 그 예로는 InputStream, OutputStream, java.sql.Connection 등이 있다. 파일처리, 네트워크 연결(socket 등), 데이터베이스 Connection Pool 자원이 제대로 닫힘을 보장하자! - 개발자가 close 메서드를 놓치는 경우가 존재한다. - 안전망으로 finalizer 가 있지만 믿을만하지 않다. 1. 전통적인 방법 try-finally // 자원이 하나인 경우 String path = "/"; BufferedReader br = new BufferedReader(new FileReader(path)); try{ String result = br.readLin..
이코테 - 퇴사 with JAVA 해결 만약, 아래와 같은 표가 있다고 가정하자 첫번째 줄은 걸리는 날, 두번째 줄은 받는 돈이다. 5 5 5 5 5 5 5 5 5 5 10 9 8 7 6 10 9 8 7 6 인덱스 9에 위치한 스케줄부터 인덱스6에 위치한 일은 할 수 없다. 인덱스 5에서는 일을 할 수 있고 인덱스 10부터 다시 일할 수 있다. 하지만 10은 존재하지 않으므로 여기까지 가장 많이 벌 수 있는돈은 10이다. 인덱스1부터 4까지는 일은 할 수 있지만 일을 하게되면 인덱스 5에 위치한 일을 할 수 없다. 따라서 돈을 최대한으로 벌려면 해당 인덱스들에서는 일을 하지 않아야 한다. 인덱스 0에서 일을하면 인덱스 5부터 다시 일을 할 수 있다. 또한, 항상 DP에서는 전의 값이 현재 값의 영향을 끼치는 형태고 기존의 리스트의 값을 ..
Effective JAVA - Item8 : finalizer와 cleaner 사용을 피하라 결론 : 자바에서는 객체 회수는 가비지 컬렉터가 담당하고 비메모리 자원 회수는 try-with-recourses가 담당하므로 여러가지 문제점이 있는 finalizer와 cleaner를 굳이 사용해 객체 회수나 비메모리 자원회수를 수행할 필요가 없다. 자바에는 두가지 객체 소멸자가 존재한다 - finalizer, cleaner 1. finalizer - 예측할 수 없고 상황에 따라 위험하다. - 오작동, 낮은 성능, 이식성 문제의 원인 - 모든 클래스는 Object 클래스를 상속받고 Object 클래스가 해당 finalizer 메서드 소유 - 별도의 스레드 풀을 가지고 동작 - 이미 Deprecated 됨. - 참조 해제 후(null 처리) System.gc() 호출시 자동으로 해당 메서드가 호출됨 2. ..
이코테 - 효율적인 화폐 구성 with JAVA 해결 예를 들어, 동전이 2원 3원이 존재하고 15원을 만든다고 가정하자. 2원만 사용하는 경우 만약, 0원이 존재한다면 0원+2원으로 2원을 만들 수 있다. 만약, 1원이 존재한다면 1원+2원으로 3원을 만들 수 있다. 만약, 2원이 존재한다면 2원+2원으로 4원을 만들 수 있다. 만약, 3원이 존재한다면 3원+2원으로 5원을 만들 수 있다. 이를 식으로 정리하면, dp[i] = Math.min(dp[i], dp[i-2]+1) 이 된다. 2원 = Math.min(2원, (2-2)원 +1) 3원 = Math.min(3원, (3-2)원 +1) 4원 = Math.min(4원, (4-2)원 +1) 코드 package JAVA.TCT.DP; import java.util.*; // 효율적인 화폐 구성 publi..
Effective JAVA - Item7 : 다 쓴 객체 참조를 해제하라 자바는 기본적으로 C나 C++에 비해 다 쓴 객체에 대한 메모리 공간에 대한 고민이 적다. 이는 자바에는 가비지 컬렉터가 있기 때문에 다 쓴 객체에 대해 알아서 제거를 해주기 때문이다. 하지만 가바지 컬렉터가 찾지 못하는 다 쓴 객체가 존재하고 이는 메모리 누수를 발생시킨다. 메모리 누수 - 메모리에 처리되지 못한 객체가 쌓이게 되고 성능저하의 원인이 된다. - 심한 경우, 디스크 페이징이나 OutOfMemoryError까지 발생하게 된다. 메모리 누수 1 : 스택과 같이 배열에 객체를 담는 경우, 데이터를 담았다 삭제할 때 , 실제 객체가 삭제되지 않음 - 스택이 여전히 다 쓴 객체들을 참조하기 때문이다. - 이는, 내부적으로 객체를 pop 처리하면 삭제하는 것이 아닌 가리키는 인덱스만 변경하는 구조이..
Effective JAVA - Item6 : 불필요한 객체 생성을 피하라. 매번 객체를 생성하는 것보단 미리 만들어놓은 객체를 사용하는 것이 좋다 - 재사용은 빠르고 세련되다 - 불변 객체는 언제든 재사용이 가능하다. 1. 객체를 계속 생성하는 안좋은 예시 String badThing1 = new String("hello world"); String badThing2 = new String("hello world"); System.out.println(System.identityHashCode(badThing1)); System.out.println(System.identityHashCode(badThing2)); 2. 만들어 놓은 객체를 다시 사용하는 예시 - 같은 가상머신내에서는 똑같은 문자열을 사용하는 모든 객체가 같은 객체를 공유한다. String goodThing1 =..
Programmers - 가사 검색 with JAVA 첫번째 시도 1. 단어들에 대해서 길이에 따른 해시맵 생성 2. 뒤집은 단어들을 길이에 따라 해시맵 생성 3. 쿼리마다 ?로 시작하는지 여부에 따라 첫번째 해시맵 또는 두번째 해시맵 불러온다. 4. 불러온 List에서 ?를 제외한 쿼리로 시작하는 단어의 개수를 구한다. 문제점 4번에서 모든 단어들을 하나씩 불러오기에는 시간복잡도에 문제가 생긴다. 두번째 시도 - 단어들에 대해서 길이에 따른 해시맵 생성 - 뒤집은 단어들을 길이에 따라 해시맵 생성 - 해시맵 정렬 - 쿼리마다 ?로 시작하는지 여부에 따라 첫번째 해시맵 또는 두번째 해시맵 불러온다. - ?를 a로 대체한 String, z로 대체한 String 두개 생성 - a로 대체한 String이 들어갈 위치와 z로 대체한 String이 들어갈 위치 구하..