동적 계획법 : 큰 문제를 작은 문제로 나눠서 푸는 알고리즘 두 가지 속성을 만족해야 DP로 문제를 해결할 수 있다. 1. Overlapping Subproblem 큰 문제와 작은 문제를 같은 방법으로 풀 수 있다. 문제를 작은 문제로 쪼갤 수 있다. 2. Optimal Substructure 문제의 정답을 작은 문제의 정답에서 구할 수 있다. 피보나치 수를 기준으로 보면 메모이제이션 : 실행된 결과를 저장해두었다가 재사용하는 최적화 기법 Top - Down : 큰 문제를 작은 문제로 나눈다. fib(n) = fib(n-1) + fib(n-2) 작은 문제를 푼다. fib(n-1) 과 fib(n-2)를 호출해 문제를 푼다. 작은 문제를 풀었으니 큰 문제를 해결한다. fib(n-1) 과 fib(n-2) 결과..
Strongly Connected : 모든 정점에서 정점으로 이동할 수 있다. SCC : 그래프를 Strongly Connected 되게 나누는 것이다. 하나의 SCC에서 두 정점 u,v를 선택하면 u에서 v로 이동가능하고 v에서 u로 이동할 수 있는 가장 큰 집합을 만드는 것이다. 간단하게 말하면 사이클이 포함된 그래프는 위상정렬이 불가능하다. 하지만 scc를 수행하면 사이클을 묶은 큰 노드들이 되고 scc로 묶인 그룹 간에는 위상정렬이 가능하게 된다. SCC를 구하는 방법으로는 코사라주알고리즘과 타잔 알고리즘이 있다 먼저 코사라주 알고리즘 부터 살펴보자 Kosarju’s algorithm 1. 첫 번째 dfs를 하면서 정점에 후위순회 번호를 매긴다. 그 다음 후위 순회 결과를 뒤집어준다. 2. 두 번..

@OneToMany annotation 을 사용 Member 과 Member로 이루어진 Team 이 있을 때 Team이 1, Member가 N인 상태이다. import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.OneToMany; import java.util.ArrayList; import java.util.List; @Entity public class Team { @Id @GeneratedValue @Column(name="TEAM_ID") private Long id;..

타입스크립트 microsoft 에서 개발 static type(정적 타입) compile time DefinitelyTyped(어떤 라이브러리의 타입정의 파일이 모여있음) 정적타입언어는 진입장벽이 있는편이고 코드의 양이 많을 때 생산성이 높고 타입오류를 컴파일 시 알 수 있다. 개발환경 세팅 Vscode에서 개발환경을 세팅해보자. 폴더를 만든 다음 다음 세 가지 명령어를 입력한다. npm init -y npm install typescript npx tsc --init 첫 번째 명령어로 package.json을 생성하고 두 번째 명령어로 타입스크립트를 설치하고 세 번째 명령어로 tsconmfig.json 파일을 생성해준다. 그리고 타입스크립트 파일을 하나 생성해 준 후 npx tsc 를 터미널에서 실행하..

필드와 칼럼 매핑 @Entity public class Member { @Id private Long id; @Column(name = "name") private String username; private Integer age; @Enumerated(EnumType.STRING) private RoleType roleType; @Temporal(TemporalType.TIMESTAMP) private Date createdDate; @Temporal(TemporalType.TIMESTAMP) private Date lastModifiedDate; @Lob private String description; } @Column : 컬럼 매핑 - 객체를 테이블칼럼에 매핑 @Enumerated : 자바 enu..
JPA에서 핵심 2가지 - ORM ( 개체와 관계형 데이터베이스 매핑) - 영속성 컨텍스트 EntityManagerFactory는 요청이 올 때마다 EntityManager를 생성한다. 영속성 컨텍스트 : 엔티티를 영구 저장하는 환경 EntityManager.persist(entity); 엔티티 매니저를 통해 영속성 컨텍스트에 접근 엔티티의 생명주기 비영속(new / transient) : 영속성 컨텍스트와 전혀 관계가 없는 새로운 형태 - 새로운 객체 생성 영속(managed) 영속성 컨텍스트에 관리되는 상태 - em.persist(entity) 준영속(detached) 영속성 컨텍스트에 저장되었다가 분리된상태 - em.detach(entity) 삭제(removed) 삭제된 상태 - em.remove(..

jpa 설정을 완료하고 CRUD 를 실습해보자. Member table을 만들어주자. 그 다음은 Member class를 만들어주자. package hellojpa; import javax.persistence.Entity; import javax.persistence.Id; @Entity public class Member { @Id private Long id; private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Long getId() { return id; } public void setId(Long id) { this.id = i..

이번에는 새로운 할인정책을 적용해봅니다. 새로운 클래스를 만들어서 기존의 DiscountPolicy interface를 implement 합시다 이 때 변경된 할인정책을 적용하려면 OrderServiceImpl 의 discountPolicy를 변경해야한다. 그런데 구체적 구현 클래스를 변경해주고 있다. 추상클래스 혹은 인터페이스에 의존하게 작성해서 OrderServiceImpl에 변경되는 사항이 없도록 하자. memberRepository 와 discountPolicy 를 생성자를 통해 의존성 주입을 하자. 그리고 실제 실행해줄 app에서 어떤 구현체를 쓸지 넣어주는 AppConfig 파일을 생성한다. memberService나 orderService를 구현할 때 어떤 구현체를 쓸지 조금더 명확하게 보이..

assertThatThrownBy(() -> "abc".charAt(3)).isInstanceOf(IndexOutOfBoundsException.class); assertThatExceptionOfType(IndexOutOfBoundsException.class).isThrownBy(() -> "abcd".charAt(5)); 자바로 어떤 함수를 작성하고 테스트를 해야 하는 경우가 있다. 간단히 예시를 들고 왔다. 이미 있는 함수로 간단히 테스트코드 작성하는 법을 알아보자. String의 split이 어떻게 동작하는가를 테스트한다. assertThat 이후 특정 값이라면 isEqualTo, 배열이 리턴된다면 contains 를 쓸 수도 있지만 containsExactly 를 통해 모든 배열값이 순서대로 ..