20210421-TIL

나영원·2021년 4월 21일
0

T.I.L.

목록 보기
143/145
post-custom-banner

오늘 할일

  • 스프링 개발 실습
  • 알고리즘 문제풀이
  • 포트폴리오 수정
  • 프로젝트 회의

오늘 한 것 & 배운 내용

알고리즘 문제 풀이

숫자카드

  • 문제 해석

    • N개의 정수와 M개의 정수가 주어질 때 M그룹의 정수가 N의 포함되어 있으면 1 없으면 0을 출력한다
  • 풀이 계획

    • N 그룹의 정수를 오름차순으로 정렬하고 M그룹의 정수를 하나뽑아 이분탐색으로 탐색속도를 줄여서 있는지 없는지 찾는다
  • 나의풀이

    • 풀이계획 처럼 풀이하였지만 이분탐색 구현에 문제가 있어서 시간초과와 런타임 에러(ArrayOutOfBound)가 발생하였다

      • true로 되어있던 이분 탐색 while문에 범위를 start<= end를 지정해주었더니 시간초과 문제가 해결되었다

      • end의 초기화를 arr.legnth로주었던걸 arr.length-1로 주었더니 런타임에러가 해결 되었다

    • 이분탐색은 정형적인 구현이기 때문에 일부러 복습삼아 자료를 찾지 않고 풀어보려고 하다보니 시간이 오래걸렸지만 그래도 모르는 부분으 확실히 복습할 수 있었다

통계학

  • 문제 해석
    • n개의 정수를 입력받아 정수들의 산술평균, 중앙값, 최빈값, 범위를 차례대로 출력하라
      • n은 홀수이다
  • 풀이 계획
    • 먼저 n개의 정수를 배열에 넣고 오름차순으로 정렬한다
    • 산술 평균은 n개의 정수를 배열로 넣는과정에서 sum을 구해서 n으로 나누어준다
    • n이 홀수 이기 때문에 중앙값은 마지막 인덱스 + 첫인덱스 /2의 위치한 값을 출력한다
    • 최빈값은 카운터 정렬을 사용할까 고민했지만 최빈값을 찾기위해서 배열을 여러번 탐색해야 될것 같아서 배열을 순회하면서 같은 값인지 count하는 방식으로 한번만 반복해서 풀기로 하였다
    • 범위는 배열에 마지막값에서 첫번째 값을 빼주면 될 것 같다
  • 나의풀이
    • 산술 평균은 소수점 첫째자리에서 반올림해주어야 됬기 때문에 Math.round를 사용했다
    • 중앙값과 범위는 계획대로 풀이할 수 있었다
    • 최빈값은 다른 값이나오면 이전 값의 counter를 비교하는 방식으로 구현을 하였는데 이렇게 구현했을 경우 마지막에 오는 값은 비교할 이전값이 없기 때문에 그냥 넘어가는 문제가 있어서 반복문이 끝나고 마지막값을 위해 한번더 조건문을 사용하는 방식으로 진행하였다
      • 풀긴 하였으나 일반적인 방법으로 적용하기엔 로직이 복잡하여서 다른 사람 눈에 한번에 들어오진 않을 것 같아서 좋은 풀이인지 의문이 갔다
  • 다른사람풀이
    • 참고 : https://st-lab.tistory.com/108
    • 카운팅 정렬을 활용한 방법이 소개 되었고 카운팅정렬을 사용하더라도 내가 사용한 로직과 크게 다르지 않고 카운팅 정렬의 시간복잡도가 낮아 성능은 잘나오니 카운틴 정렬을 활용하는게 더 나은 풀이방법같다
    • 다시푼풀이
      • 카운팅 정렬을 활용하기 위해서 4000을 기준으로 음수와 양수를 구분해주기 위해 값에 모두 +4000을 해주고 사용할 땐 -4000을 사용하는 식으로 표현했다
      • 중앙값은 n/2의 값에 있기 때문에 카운팅한 값을 합쳐나가다가 n+1 / 2 를 초과하는 시점에 멈추면 그값이 중앙값이 된다

스프링 부트 실습

NGINX를 활용한 무중단 배포

실습 중 문제 해결

  • sudo yum install nginx명령어로 ec2에 nginx가 설치되지 않는 문제

    • Amazon linux 2에서는 yum을 통해 nginx가 설치되지 않는다고 하여 sudo amazon-linux-extras install -y nginx1 명령어로 설치
    • 참고 : https://freedeveloper.tistory.com/340
  • ProfileController를 만들고 테스트를 위해 배포를 했는데 8080port가 이미 사용중이라는 메세지와 함께 스프링 구동 실패

    • deploy.sh에 현재 구동중인 port를 kill하는 구문이 작동하지 않는 것으로 파악

    • CURRENT_PID=$(pgrep -fl $PROJECT_NAME | grep jar | awk '{print $1}')
      • issue에서 검색본 결과 jar -> java로 변경해서 해결 가능하다는 답변을보고 시도했으나 실패
      • $PROJECT_NAME을 변수로 사용하지 않고 직접 타이핑해서 배포해봤던 성공

해결 못한 문제

  • 배포까지는 잘이루어지는데 switch.sh가 service-url.inc에 변화를 주어야 nginx가 바라보는 port에 변화가 일어나는데 반영이 안되서 nginx가 8080을 계속 바라보고 있다
  • 8081 -> 8082 포트로 변화가 일어나야하는데 계속 8081포트로 시도를 해서 8081 already use라고 뜬다
  • 둘다 스크립트가 제대로 반영이 안되고 있는 문제인데 다음에 이부분까지 마무리하면 될 것 같다

프로젝트 회의

  • 전체적인 기획회의가 마무리되고 백엔드 회의를 시작하게 되었다

DB 설계

  • 기존에 설계된 DB를 바탕으로 기획회의 때 논의 한 내용을 반영한 DB설계를 하는 것에 중점을 두고 이야기를 나누었다
  • 강사가 강의를 등록하고 강의 별로 장소와 시간대를 설정할 수 있도록 되어 있어서 lecture 도메인이 schdule - date- time 이런식으로 세분화 되어서 관리가 되어야 한다고 판단하였다

내일 할일

  • 스프링 실습 마무리
  • 알고리즘 문제풀이
  • 포트폴리오 수정
  • 프로젝트 회의
profile
배우는 개발 일기
post-custom-banner

0개의 댓글