23-07-03 TIL

more·2023년 7월 3일
0

문제

  • 과제 코드를 보다가 생각했었던 문제가 리턴 타입이 다른 경우 어떻게 리턴을 해야하나 하는 문제였다.
    • 리턴을 할때에 PostResponseDto를 리턴하는데 이때 exception을 잡기 위해서, return에 ApiResult라는 객체를 사용해서 메시지와 http 상태 코드를 리턴해주어야하는데, 이 경우에 PostResponseDto와 ApiResultDto를 어떻게 같이 리턴해주나가 관건이었다.

시도

  • 내가 시도했던 방법은 다음과 같다. (과제를 제대로 제출하지는 못했지만...)
    • ApiResultDto의 field 값들을 PostReponseDto에 넣어주는 것이다.
    • 그렇게 하면 PostResponseDto의 값이 늘어나고, 추가 된 필드에 null이 들어가기는 하지만, 그게 메시지와 상태코드까지 전달해주는 방법이라고 생각하였다.
    • 근데 그렇게 하면 필요없는 null 값을 계속 전달해주기는 한다...

해결

  • @JsonInclude(JsonInclude.Include.NON_NULL)
    • 더 좋은 방법은 다음과 같다.
    • 자바는 객체 지향언어이고 상속을 사용할 수 있으므로, PostResponseDto에 extends로 ApiResultDto를 해주면 ApiResultDto를 사용할 수 있고, 그 값으로 리턴을 해줄 수 있다.
    • 그렇다면 결국 null 값이 들어간 필드가 리턴되는 것을 똑같은데 이것을 어떻게 해결해 줄 수 있을까?
    • @JsonInclude(JsonInclude.Include.NON_NULL) 을 사용하면 extends를 통해 받은 ApiResultDto의 두 필드값이 null이면 리턴해주지 않는다.

오늘 푼 문제

  • 백준 24060 (병합 정렬 1) - C

    • Introduction To Algorithms 3rd의 chapter 1, 2를 공부하고 그 안에 삽입 정렬과 병합 정렬 중 병합 정렬 문제를 직접 풀어보고자 하여서 백준에 검색하였다.
    • 알고리즘 자체는 수도코드로 문제 자체에서 제공을 해주기 때문에 기존 배열에 tmp 배열의 값이 저장되는 부분만 따로 만들어서 출력하면 되는 문제이다.
    • 정렬에 관한 알고리즘은 직접 만들어서 풀고 싶어서 C언어로 만들어서 풀어보았다.
    
    #include <stdio.h>
    #include <stdlib.h>
    
    int cnt = 0;
    
    void merge(int arr[], int p, int q, int r, int K) {
    
      int i = p;
      int j = q + 1;
      int t = 1;
    
      int tmp[r + 2];
    
      while (i <= q && j <= r) {
        if (arr[i] <= arr[j]) {
          tmp[t++] = arr[i++];
        } else
          tmp[t++] = arr[j++];
      }
    
      while (i <= q)
        tmp[t++] = arr[i++];
    
      while (j <= r)
        tmp[t++] = arr[j++];
    
      i = p;
      t = 1;
    
      while (i <= r) {
        arr[i++] = tmp[t++];
        if (++cnt == K)
          printf("%d\n", tmp[t - 1]);
      }
    }
    
    void merge_sort(int arr[], int p, int r, int K) {
      if (p < r) {
        int q = (p + r) / 2;
        merge_sort(arr, p, q, K);
        merge_sort(arr, q + 1, r, K);
        merge(arr, p, q, r, K);
      }
    }
    
    int main() {
    
      int size = 0, K = 0;
    
      scanf("%d %d", &size, &K);
    
      int arr[size];
    
      for (int i = 0; i < size; i++)
        scanf("%d", &arr[i]);
    
      merge_sort(arr, 0, size - 1, K);
    
      if (cnt < K)
        printf("-1\n");
    
      return 0;
    }
  • 백준 10817 (세 수) - C

    • 마찬가지로 정렬을 해서 그 중에 두 번째 크기의 수를 출력하는 문제이다.
    • 병합정렬을 배운 김에 이 문제도 병합 정렬로 풀고 싶어서 병합 책에 있는 병합 정렬 수도 코드를 다시 작성해본 다음에 풀어보았다.
    
    #include <stdio.h>
    #include <stdlib.h>
    
    int cnt = 0;
    
    void merge(int arr[], int p, int q, int r) {
    
      int i = p;
      int j = q + 1;
      int t = 1;
    
      int tmp[r + 2];
    
      while (i <= q && j <= r) {
        if (arr[i] <= arr[j]) {
          tmp[t++] = arr[i++];
        } else
          tmp[t++] = arr[j++];
      }
    
      while (i <= q)
        tmp[t++] = arr[i++];
    
      while (j <= r)
        tmp[t++] = arr[j++];
    
      i = p;
      t = 1;
    
      while (i <= r) {
        arr[i++] = tmp[t++];
      }
    }
    
    void merge_sort(int arr[], int p, int r) {
      if (p < r) {
        int q = (p + r) / 2;
        merge_sort(arr, p, q);
        merge_sort(arr, q + 1, r);
        merge(arr, p, q, r);
      }
    }
    
    int main() {
    
      int arr[3];
    
      scanf("%d %d %d", &arr[0], &arr[1], &arr[2]);
    
      merge_sort(arr, 0, 2);
    
      printf("%d\n", arr[1]);
    
      return 0;
    }

0개의 댓글