20210419-TIL

나영원·2021년 4월 20일
0

T.I.L.

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

오늘 할일

  • 스프링 개발 실습
  • 알고리즘 문제풀이
  • 프로젝트 준비

오늘 한 것 & 배운 내용

알고리즘 문제 풀이

소인수 분해

  • 문제 해석

    • 정수 N이 주어지고 소인수 분해를 하여 그 결과를 한줄씩 출력하는 문제
  • 풀이 계획

    • N을 i로 나누어 나누어 떨어지면 출력하고 다시 같은 수로 나누고 떨어지지 않으면 i에 ++하는 방식으로 풀면 그 값이 나올 것 같다
    • 언제까지 나누어야 하는가?
      • N이 소수이거나 1이 될때까지 나누어야 할 것 같다
        • i < N일 때까지만 나누면 조건을 만족시킬 것 같다
        • N == 1일때는 나눈 값이 1이 되어 더이상 소수가 나올 수 없기 때문이다
  • 나의풀이

    • i<N까지라고 생각했는데 i ==N일 때 나누어서 나눈값이 1이 되는 것이기 때문에 i<=N까지로 범위를 지정해 주었어야 했다
  • 다른사람 풀이

    • 참고 : https://st-lab.tistory.com/152
    • 위의 방식에서 약수의 성질을 이용하여 N까지 찾는 것이 아닌 N의 제곱근까지만 탐색해도 전체 약수를 모두 구할 수 있다
      • 어떤 수 N의 약수는 N의 제곱근을 기준으로 짝을 이룬다는 것을 기억해야 활용할 수 있는 성질인 것 같다
  • 다시푼 풀이

    • 소인수 분해, 약수 등의 기본적인 수학의 원리를 이용한 풀이들이 반복되고 있으니 잘 익혀두는게 좋을 것 같다

카드2

  • 문제 해석
    • 1~N까지의 숫자가 있을때 가장 앞에 있는 숫자를 버리고 두번째있는 숫자를 뒤로 보낸다고 했을 때 가장 마지막에 남는 숫자를 구하시오
  • 풀이 계획
    • 계획 1 - 큐를 이용한풀이
      • 큐를 선언한다
      • 1~n까지의 값을 큐의 넣는다
      • 첫번째값을 pop하고 두번째 값을 pop한뒤 큐의 사이즈가 0이면 pop한 값을 출력하고 아니라면 다시 큐에 put한다
    • 계획 2 - 배열을 이용한 풀이
      • n의 2배 크기의 배열을 선언한다
      • 배열에 1~n까지의 값을 넣는다
      • index, top, size 변수를 선언한다
        • index = 0, top = n, size = n으로 초기화한다
      • index를 ++해주고 size를 --해준다
      • size가 1보다 크다면 index의 값을 top에 넣어주고 index를 ++한다
        • 1보다 작거나 같다면 index의 값을 출력한다
  • 나의풀이
    • 계획 2를 활용해 배열을 크게만들어 index++해 가는 방식으로 풀어보았다
    • 계획과 달랐던 부분
      • index가 해깔리니 0으로 초기화하는 것이 아닌 1로 하고 top을 n=1로 초기화 하였다
      • 배열의 사이즈를 2 n으로 했는데 배열을 n까지 넣고 시작하니 (2n)+1이 되어야 딱 맞게 된다
      • 값을 넣은뒤 top을 ++해주어야 한다
      • n==1일 때를 생각못했는데 이때는 가장 앞에 조건식으로 바로 n을 출력하게 한뒤 나머지 모든 구현을 else로 해서 구현하도록 하였다
  • 다른 사람 풀이
    • size를 구지 변수로 선언하지 않고 N을 size처럼 활용해서 풀 수도 있었던 것 같다

요세푸스 문제

  • 문제 해석
    • 1~N까지의 숫자가 있을때 K번째 숫자를 계속 빼나가면서 나온순서대로의 수열을 만드는 문제
  • 풀이 계획
    • 계획 1 - 큐이용
      • queue를 선언해 2번 pop하고 다시넣고 , 세번째에는 pop만 해서 출력해주는걸 끝날때까지 반복한다
    • 계획 2 - 배열이용
      • 1부터 n까지의 배열을 만든다
      • 순회를 하며 값이 false이면 count하지 않고 true이면 count한다
        • count가 k랑 같아질때까지 반복하여 같으면 해당 count를 false로 만들고 index를 출력한다
  • 나의풀이
    • 계획 2를 이용해서 풀게 되었다
    • n개 까지의 boolean 배열을 만들어 n번만큼 순회하여 index를 하나씩 증가시켜나가면서 ture인 경우 count를 증가시키고 count가 k와 같아지면 해당 index를 출력하고 그 값을 fasle로 만든다
      • 만약 index가 n과 같아지면 index 를 1로만들어서 계속 반복될 수 있도록 한다
    • 아쉬운 점은 계속 해서 탐색한 값을 중복적으로 탐색하도록 만들었는데 이미 false인 값은 안볼 수 있도록 하면 성능에 도움이 될 것 같다
  • 다른사람풀이
    • 참고 : https://st-lab.tistory.com/197
    • 큐를 이용한 방법과 리스트를 이용한 방법이 있었다
      • 리스트를 이용한 방식은 매번 k번째 인덱스에서 값을 꺼내주면 되는데 인덱스가 list의 size를 넘어가지 않도록 나머지를 이용하는게 포인트인 것 같다

스프링 부트 실습

Travis CI 배포 자동화

실습 중 문제해결

  • 실습에서 사용하는 travis-ci.org가 더이상 사용되지 않고 travis-ci.com으로 이관되었다는 것을 알게 되어 .com으로 다시 넘어가게 되었다
    • org에서 수동으로 build가 되는데 push시에 자동으로 ci가 되지 않는 것을 발견하고 트러블 슈팅을 하다가 실습 repo issue에서 org가 운영을 종료하게 되었으니 .com을 이용하라는 issue를 찾게 되었다
      • 어떤 서비스를 이용하다 발생하는 문제는 issue를 통해 찾아볼 수 있다는 것을 다시알게되었다
  • travis.com으로 가서 실습 레포를 찾아보고 있는데 계속 뜨지 않아 문제가 뭔지 찾아보니 org에서 사용한 repo는 .com으로 migration이 필요하다는 것을 알게되어 진행하였다
    • migration은 다른 운영환경으로 옮겨가는 과정을 뜻한다고 한다
    • settings에서 간단하게 진행할 수 있었고 이후 테스트 해보니 정상 동작하는 것을 확인할 수 있었다
  • ec2에 codedeploy agent를 까는 과정에서 /usr/bin/env: ruby: No such file or directory 에러 발생
    • ec2에 ruby가 설치되어 있지 않아 발생한 문제로 yum을 통해 ruby를 설치하여 해결
  • unknown 에러와 opearting system을 명확히 하라는 메시지와 함께 배포실패
    • appspec.yml에 version앞에 공백이있는걸 지우니 제대로 인식했는지 정상 작동

전체적인 배포과정 정리

  • 프로젝트의 커밋을 master브랜치로 push한다

  • travis가 travis.yml에 작성된 내용을 바탕으로 빌드 & 배포하는 과정을 실행한다

    • ./graldew celan build를 실행해 jar파일을 생성한다

    • jar파일과 appsepc.yml, 그리고 스크립트 파일들을 한곳에 모아서 zip파일로 압축한다

    • 압축된 zip파일을 지정된 s3 버킷에 업로드한다

    • codeDeploy를 통해 s3 bucket에 있는 zip파일을 바탕으로 ec2 인스턴스에 배포과정을 거친다

      • zip파일을 ec2에 지정된 위치에 압축을 풀게된다
      • 모든 파일들이 ec2-user 권한을 갖도록 한다
      • Application Start 과정에서 deploy.sh가 실행되도록 한다
        • 지정된 위치에 빌드파일을 복사하고 현재 구동된 프로세스가 있으면 kill하고 새로운 jar파일을 통해 배포를 한다
    • mail로 배포 결과를 알린다

배운점

  • 지난번 프로젝트 때 Gitgub Actions를 이용해 CI/CD를 구축했는데 travis가 거의 동일한 역할을 해준다는 것을 알았고 이해하지 못하고 사용하던 내용들을 조금더 이해하며 실습해볼 수 있었다

    • 마지막에 빌드 & 배포 과정을 정리하면서 한번더 확실히 과정을 복습할 수 있었다
  • 실습 과정이 하나 하나를 실행하며 실행되는지 테스트를 하고 그이후 다음 단계로 진행되는 과정이 당연해 보이지만 개발에 가장 기본적인 프로세스로 프로젝트를 진행하면서 꼭 테스트를 기반으로 진행해야겠다는 생각을 다시해보았다

내일 할일

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

1개의 댓글

comment-user-thumbnail
2021년 4월 20일

저도 배우고 싶어서 그런데 어느 교육기관에서 배우시는 건지 알려주실 수 있을까요
학원명과 코스명이 궁금합니다 😀

답글 달기