//////
Search
🗒️

황민우

날짜
2022/12/08
작성자
황민우
카테고리
회고

Dynamic Programming

1.
큰 문제를 작은 문제로 나누어 해결한다.
2.
중복되는 반복 작업을 최적화한다.
메모를 해 두었다가 다시 사용하는 방법 (메모이제이션)

피보나치 수열

fib(5)=fib(4)+fib(3)fib(5) = fib(4) + fib(3)
fib(4)=fib(3)+fib(2)fib(4) = fib(3) + fib(2)
fib(3)=fib(2)+fib(1)fib(3) = fib(2) + fib(1)
fib(3)=fib(2)+fib(1)fib(3) = fib(2) + fib(1)
fib(5)를 구하기 위해 fib(4)와 fib(3)을 구하고 fib(4)를 구하기 위해 fib(3) + fib(2) 를 구해야한다.
fib(3)을 구하기 위해서 fib(2)와 fib(1)을 구한다.
그리고 fib(3)[fib(5)을 구하기 위한]을 구하기 위해 같은 작업을 반복한다.
이렇게 같은 작업을 반복해서 계산하는 것은 비효율적이기 때문에 한 번 계산한 값은 기록해두었다가 같은 계산이 필요할때 불러와 재사용하는 방법이 Dynamic Programming(DP)이다.

코드

기존 피보나치 수열 (재귀) 코드
public class Fibonacci { public static int fibonacci1(int num) { if (num <= 2) return 1; return fibonacci2(num - 1) + fibonacci2(num - 2); } }
Java
복사
DP적용 피보나치 수열 코드
public class Fibonacci { private static boolean[] marker; private static int[] memo; public static int calculate1(int num) { marker = new boolean[num]; memo = new int[num]; return fibonacci(num); } private static int fibonacci(int num) { if (marker[num - 1]) return memo[num - 1]; if (num <= 2) { marker[num - 1] = true; memo[num - 1] = 1; return 1; } marker[num - 1] = true; memo[num - 1] = fibonacci(num - 1) + fibonacci(num - 2); return memo[num - 1]; } }
Java
복사
메모한 값이 있는지 없는지 확인하는 boolean 배열 marker
값을 메모해둘 int 배열 memo
fibonacci(num)가 실행되면 num - 1에 값이 있는지 확인하고 있으면 그 값을 리턴해 반복되는 작업을 줄인다.
값이 없으면 marker에 값이 있음을 표시해주고 memo에 해당 값을 계산하여 담아준다.
그리고 그 값을 반환한다.
(굳이 marker 변수는 필요없을 것 같다.)
DP적용 재귀X
public class Fibonacci { private static int[] memo; public static int fibonacci(int num) { memo = new int[num]; for (int i = 0; i < num; i++) { if (i < 2) { memo[i] = 1; continue; } if (memo[i] == 0) { memo[i] = memo[i - 1] + memo[i - 2]; } } return memo[num - 1]; } }
Java
복사
전체 코드

LCS (Longest Common Subsequence)

2차원 배열 생성

1.
두 문자열의 길이들로 2차원 배열을 생성.
2.
2중 for문으로 두 문자열을 비교.
3.
문자가 같으면 왼쪽 위에 담긴 값에 +1
4.
다르면 위, 왼쪽 중 큰 값을 담는다.
코드

스프링 부트

Audit 기능 추가

Audit은 데이터 생성시간 또는 수정시간 등을 자동으로 입력해주는 기능이다.
예를 들어 가입날짜, 게시글 등록 시간 등을 자동으로 입력하고 싶을때 사용할 수 있다.
생성 주체, 변경 주체도 입력할 수 있다.

적용

JpaAuditingConfiguration.java
@Configuration @EnableJpaAuditing public class JpaAuditingConfiguration { }
Java
복사
@EnableJpaAuditing 어노테이션을 MainApplication에 넣어도 적용된다.
하지만, 테스트 코드를 짤때 추가적인 설정, 어노테이션이 들어가야하기 때문에 @EnableJpaAuditing을 적용할 Configuration 파일을 따로 생성한다.
BaseEntity.java
@Getter @Setter @MappedSuperclass @EntityListeners(AuditingEntityListener.class) public class BaseEntity { @CreatedDate private LocalDateTime createdAt; @LastModifiedDate private LocalDateTime updatedAt; }
Java
복사
@MappedSuperclass
@MappedSuperclass가 선언되어 있는 클래스는 엔티티가 아니다. 당연히 테이블과 매핑도 안된다.
단순히 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공한다.
여러 엔티티들의 공통분모를 분리하고 상속받아 사용하기 위해 필요한 어노테이션.
@EntityListeners(AuditingEntityListener.class)
@CreatedDate, @LastModifiedDate 등의 Auditing을 위한 어노테이션을 사용하기 위해서 붙여줘야한다.
Visit.java
@Entity @Getter @Builder @AllArgsConstructor @NoArgsConstructor public class Visit extends BaseEntity{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne private User user; @ManyToOne private Hospital hospital; private String disease; private Integer expense; }
Java
복사
extends BaseEntity로 상속받아오면 BaseEntity에 있는 필드를 가져와 사용한다.
BaseEntity 없이 Auditing 적용하기
@Entity @Getter @Builder @AllArgsConstructor @NoArgsConstructor @EntityListeners(AuditingEntityListener.class) public class Visit { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne private User user; @ManyToOne private Hospital hospital; private String disease; private Integer expense; @CreatedDate private LocalDateTime createdDatetime; }
Java
복사
역시 Auditing을 적용하기 위해서 @EntityListeners(AuditingEntityListener.class)를 붙여주고
필요한 Auditing 어노테이션을 필드에 붙여 사용하면된다.
위 예시에서는 생성날짜만 등록되도록 했다.

GitLab

CI/CD란?

CI : Continuous Integration 지속적인 통합
CD : Continuous Deployment 지속적인 배포

멤버 초대

유저이름이나 이메일로 유저 검색.
권한 설정.
Access expiration date는 옵션.

이슈 트래커

이슈 작성

할 일, 계획을 제목에 간단히 적고 본문에 자세한 사항을 기입한다.
Assignee에는 작업을 할 멤버를 배정해준다.
Due date는 작업 완료 기한을 입력해준다.

나에게 할당된 이슈 확인

화면 우측 상단에 Issue 또는 To Do List로 내게 할당된 작업을 확인하고 진행하면 된다.

팀 프로젝트

다가오는 프로젝트를 위해 관련 수업 내용을 정리했다.

역할, 임무

1.
PM
a.
프로젝트가 진행되는데 있어서 필요한 의사소통
b.
업무 할당
2.
CTO
a.
공통 영역 개발
b.
나누기 애매한 작업 개발
c.
DB 설계, ERD 작성
3.
기획
a.
개발 문서 피드백
b.
화면 설계
c.
화면 흐름 설계
4.
인프라
a.
빌드, 배포와 관련된 작업
b.
AWS, Docker, CI/CD 파이프라인 구성
5.
개발
a.
PM, CTO와 할당한 작업 개발

문서 작성

기능 정의서

어떤 기능을 구현할지 작성.
enppoint도 작성해주면 좋을 것 같다.

테이블 정의서

기능 구현을 위해 필요한 테이블을 설계.
테이블 이름, 컬럼이름, 타입, 컬럼 설정 등을 작성.

ERD

테이블간 연관관계를 다이어그램으로 표현.

작업 계획서

해야할 작업들을 누가 어떤 작업을 언제까지 해야하는지 작성.