JAVA (17) 썸네일형 리스트형 [algorithm] 그리디(greedy, 탐욕) 알고리즘 🤔 그리디 알고리즘 탐욕, 욕심쟁이 알고리즘이라고도 불림. 미래를 생각하지 않고 각 단계에서 가장 최선의 선택을 하는 기법 선택의 순간마다 당장 눈앞에 보이는 최적의 상황만을 쫒아 최종적인 해답에 도달하는 방법 일반적인 상황에서 그리디 알고리즘은 최적의 해를 보장할 수 없을 때가 많다 현재의 최적 해 != 전체의 최적 해 🧦 사용해야 하는 조건 서울에서 대전을 거쳐 부산까지 가는 최적의 경로를 선택해라. 1. 현재의 선택이 미래의 선택에 영향을 주지 않는다. 2. 부분의 최적 해가 모이면 전체의 최적 해가 된다. 그리디 문제를 푸는 방법의 핵심은 정렬이다. 어떻게 정렬해야 이 두가지 조건을 만족할 수 있을지 생각해야한다. 🤖 그리디는 왜 사용할까? 빠른 속도 : 항상 최적의 선택을 하기 때문에 dp보다도.. [Algorithm] 정렬 알고리즘(버블정렬, 선택정렬, 삽입 정렬) 버블정렬(Bubble Sort)버블정렬(Bubble Sort)은 인접한 두 개의 요소를 비교하면서 크기가 작은 요소를 앞으로 이동시키고 큰 요소를 뒤로 이동시키면서 정렬하는 알고리즘이다. 버블정렬의 동작 방식 1. 배열의 첫번째 요소부터 마지막 요소까지 반복하여 인접한 두 요소를 비교한다. 2. 왼 쪽 요소가 오른쪽 요소보다 크면, 두 요소의 위치를 교환한다. 3. 배열의 마지막 요소까지 이동한 후, 가장 큰 요소가 배열의 마지막에 위치하게 된다. 4. 다음 반복에서는 배열의 첫번째 요소부터 마지막에서 두번째 요소까지 인접한 두 요소를 비교하면서 정렬한다. 마지막 요소는 이미 정렬이 완료되었기 때문에 제외한다. 5. 이러한 과정을 배열의 모든 요소가 정렬될 때까지 반복한다. 1~4번 과정을 배열이 정렬될.. [Effactive Java] 불필요한 객체 생성을 피하라 - 6 다음과 같은 세 가지 경우에서 불필요한 객체 생성을 피하자 문자열 정규식, Pattern 오토박싱(auto boxing) 문자열 JVM은 내부적으로 문자열을 해시맵 풀에 담아두고 어디선가 동일한 문자열을 참조하면 만들어 놓은 풀에서 참조하는 방법으로 재사용하고 있다. 그렇기에 문자열 생성에 new String("hello")를 사용한다면 불필요한 객체를 생성하게 된다. 사실상 동일한 객체라서 매번 새로 만들 필요가 없다. new String("자바")을 사용하지 않고 문자 리터럴 ("자바")을 사용해 기존에 동일한 문자열을 재사용하는 것이 좋다. public class Strings { public static void main(String[] args) { String hello1 = "hello"; .. JUnitParamsRunner 매개변수를 이용하여 Junit 테스트 매개변수를 이용하여 Junit 테스트하기, 여러 경우의 수를 간단하게 테스트 가능하게 해준다. 1. build.gradle dependency 추가 implementation 'pl.pragmatists:JUnitParams:1.1.1' maven의 경우 https://github.com/Pragmatists/JUnitParams 참고 2. 테스트 클래스에 @RunWith 어노테이션 추가 @RunWith(JUnitParamsRunner.class) 3. @Parameters 어노테이션에 파라미터 넣어주기 @Parameters({ "0, 0, true", "100, 0, false", "0, 100, false" }) JUnitParamsRunner 적용 전 테스트 @Test public void test.. [JAVA 8] 날짜/시간 표현 (Instant, ZonedDateTime, LocalDateTime, Period) 자바 8이전의 날짜와 시간 정보는 Date, Calendar, SimpleDateFormatter 클래스를 이용왔지만, 이러한 기존 날짜를 표현하는 라이브러리들은 다양한 문제를 가져왔다. 기존 Date, Calendar 등 날짜/시간 표현식의 문제점 - 변경이 가능하다. : 날짜/시간 유형은 변경 불가능한 유형으로 유용하게 모델링 되는 자연 값이다. Date와 같은 기존 클래스는 mutable 하기 때문에 thread safe 하지 않아 멀티 쓰레드 환경에서 안전하게 사용하기 어렵다. - 클래스의 이름이 명확하지 않다. : Date인데 시간까지 설정이 가능하다는 것이 프로그램을 모호하게 만든다. - 월을 표현할 때 +1을 해주어야한다. : type safe 하지 않으며, 버그 발생의 여지가 있다. 그 외.. [JPA ERROR] entity 클래스에 @Data 사용 시 java.lang.StackOverflowError 발생 오류 원인 - @Data 어노테이션 안에 있는 @EqualsAndHashCode 어노테이션이 연관관계 매핑 과정에서 무한 루프로 인해 스택오버플로우를 발생시켰다. - @EqualsAndHashCode 어노테이션에서 모든 필드를 기반으로 두 객체와 내용을 비교하는데, OneToMany와 같이 양방향 의존관계를 설정하면 hashCode가 중복되어 무한으로 hashCode 함수가 호출되어 상호 참조로 인한 스택오버플로우가 발생한다. 해결 - 엔티티 클래스에 @Data 사용을 자제하고 필요 어노테이션을 따로 설정하면 된다. - @EqualsAndHashCode(of = "id")로 아이디 정도만 걸어주는 게 좋을 거 같다.. Reference https://projectlombok.org/features/Data h.. [디자인 패턴] 자바의 싱글톤 패턴 (static) 싱글톤 패턴(Singleton Pattern) 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴으로, 보통 데이터베이스 연결 모듈(DBCP, DataBase Connection Pool)에 많이 사용된다. 하나의 인스턴스를 만들어 놓고 해당 인스턴스를 다른 모듈들이 공유하며 사용하기 때문에 인스턴스를 생성할 때 드는 비용이 줄어드는 장점이 있고, 반대로 의존성이 높아진다는 단점이 있다. 자바에서 static 키워드를 사용하면 오직 하나의 인스턴스를 사용하는 싱글톤 패턴이 된다. class Singleton{ private static class singleInstanceHolder{ private static final Singleton INSTANCE = new Singleton(); } public.. [JAVA 8] 분할 가능한 Iterator인 Spliterator 인터페이스 자바8에서 추가된 쪼갤 수 있는 기능을 가지고 있는 iterator란 뜻으로, Split + Iterator 인 Spliterator 인터페이스는 병렬 작업에 특화되어있다. 즉 Iterator가 반복이라면, Spliterator는 분할 가능한 반복이다. Iterator import java.util.*; public class Solution3 { public static void main(String[] args) { List list = new ArrayList(); list.add("콜팝"); list.add("치킨"); list.add("곱창"); list.add("팝콘"); list.add("피자"); Iterator listIterator = list.iterator(); while(listI.. 이전 1 2 3 다음