본문 바로가기
2023./11월

[2023.11.11] Yui

by yuiee 2023. 11. 11.

이번주 한일

  • 알고리즘 DP, 완전탐색
  • 네트워크, 데이터베이스 키워드 정리 스터디
  • 운영체제 스터디
  • 서블릿 컨테이너와 스프링 컨테이너 공부
  • rest docs github pages 배포 완료

느낀 점

알고리즘

알고리즘 DP 개념 강의를 듣고 관련 문제를 풀었다. DP 풀이 방식 중 재귀와 상향식을 이용한 풀이가 있었는데, 참조값을 이용하는 것과 복사한 값을 이용하는 것의 차이를 인지하지 못해서 이해하는데 시간이 걸렸었다.
다음은 백준 문제 2240번 풀이의 일부이다.

    private static int getFruit(int idx, int tree, int count){
        if (count < 0) return MIN_VALUE;
        if (idx == n) return count == 0 ? 0 : MIN_VALUE;
        int ret = dp[idx][tree][count];
        if (ret != -1) return ret;
        int segment = (tree == treeNumbers[idx] - 1) ? 1 : 0;
        dp[idx][tree][count] = Math.max(getFruit(idx + 1, (tree + 1) % 2, count - 1), getFruit(idx + 1, tree, count)) + segment;
        return dp[idx][tree][count];
    }

 

    private static int getFruit(int idx, int tree, int count){
        if (count < 0) return MIN_VALUE;
        if (idx == n) return count == 0 ? 0 : MIN_VALUE;
        int ret = dp[idx][tree][count];
        if (ret != -1) return ret;
        int segment = (tree == treeNumbers[idx] - 1) ? 1 : 0;
        ret = Math.max(getFruit(idx + 1, (tree + 1) % 2, count - 1), getFruit(idx + 1, tree, count)) + segment;
        return ret;
    }

위의 풀이는 배열을 이용한 메모라이제이션을 해서 DP 방식의 풀이를 한 것이고, 아래의 풀이는 단순한 재귀방식의 풀이가 된다.
개인적으로 DP가 풀이 방법을 떠올리면 비교적 쉽게 접근이 가능한데, 풀이 방법을 떠오르지 못하면 지옥이 열리는 거 같다.

 

DP 문제를 풀 때 다음과 같은 과정을 기억하고 수행하면 좀 더 빠르고 올바르게 풀 수 있을 거 같다.

  1. DP 배열에 쓰이는 상태값 찾기
  2. 규칙 찾아서 점화식 세우기
  3. 재귀 방식의 DP 이용할 경우 메모라이제이션 되고 있는지 확인하기

그리고 랜덤한 문제를 볼 때 1.완전탐색 2.DP 3.그리디 순으로 생각해보는 연습을 하면 좋을 거 같다.

 

API 문서 페이지 github page로 배포하기

 

팀원 분과 프로젝트에서 해야할 업무를 분담할 때, 팀원 분이 로그와 액추에이터 작업을 맡아주셨고, 나는 API를 문서화해서 github page에 배포하는 작업을 맡았다.

 

 컨트롤러 테스트 시 원래는 Mokito Extension을 활용해서 테스트를 하고 있었는데, rest docs 적용을 하기 위해서 WebMvcTest를 적용했어야 했다. 그 과정에서 웹 설정이 의존성이 있어서 예외가 발생했고, 방법을 찾아보다가 인터셉터나 필터, WebConfig를 Mock Bean으로 등록하는 방식으로 해서 WebMvcTest를 통과시켰다. 이 방식이 웹 관련 계층들만 빈으로 등록한다는 장점이 있지만, 인터셉터가 추가되면 Mock Bean으로 계속 추가를 해줘야 될 것 같아서 그 부분이 아직도 고민이다. 그렇지만 다음 작업도 해야 되서 일단 이렇게 변환시켰다.

 

Github Page를 배포할 때도 문제가 있었다. 내가 REST API build.gradle에 추가한 작업 때문에 팀원 분이 설정해두신 CI workflow가 정상적으로 작동하지 않았다. 알고보니, 테스트 통과한 것을 html로 바꿔주는 asciidoctor 작업을 빌드 할 때 같이 진행시키게끔 해서 예외가 발생했었다. build.gradle 작성할 때도 다른 작업이랑 충돌되지 않는지 살펴봐야 겠다.

다음주 할일

  • 슬슬 지원을 해보자..!
  • CS 키워드 좀 더 꼼꼼하게 정리하는 시간 갖기
  • 데이터베이스 공부
  • 운영체제 스터디
  • 이펙티브 자바 1장

'2023. > 11월' 카테고리의 다른 글

[2023. 11. 11] Youl  (0) 2023.11.11
[2023. 11. 11] Jung  (0) 2023.11.11
[2023.11.10] this-is-spear  (0) 2023.11.10
[2023.11.10] Nami  (0) 2023.11.10
[2023.11.03] Nami  (0) 2023.11.05