20210422-TIL

나영원·2021년 4월 22일
0

T.I.L.

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

오늘 할일

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

오늘 한 것 & 배운 내용

스프링 부트 실습

NGINX를 활용한 무중단 배포

실습 중 문제 해결

  • 어제 해결하지 못했던 문제를 다시 확인하기 위해 원본 레포에서 스크립트를 복사해서 변경점을 찾아보았더니 health.sh에서 switch.sh를 import하기 위해서 사용한 source 구문이 대문자로 씌여있었다
    • 실습 중에도 오타로 인한 많은 디버깅을 진행해왔었는데 이렇게 중간에 하나씩 있는 오타는 정말 찾기도 힘들고 찾아내고도 별로 보람이없는 디버깅인 것 같다
    • 오타를 어떻게 줄일수 있을까 혹은 어떻게 빨리찾아낼 수 있을까도 나의 생산성과 연관이 되는 문제인 것 같다

실습 마무리 및 배운점

  • 긴텀을 가지고 진행한 실습이지만 하나하나 실습할때마다 배운 것이 많아 유익한 시간이었다
    • 프로젝트에서도 내가 얼기설기 모은 지식들로 비슷하게 진행했지만 확실히 알고 진행하는 것하고는 확연이 차이가 난다는 것을 알 수 잇었따
  • 아쉬운건 이번엔 블로그내용을 위주로 진행했기 때문에 자세한 설명들과 왜이렇게 하는지에는 초점을 많이 두지 못했는데 정식강의와 책을 바탕으로 진행하는게 같은시간에서도 더 많은 것을 얻을 수 있을 것 같다
  • 확실히 어떤걸 만들어가면서 배우는게 도움이 많이 되는 것 같아서 앞으로 강의 선택도 이런 부분을 위주로 진행이 되어야 된다고 생각했다

프로젝트 준비

DB설계

  • 결제 기능에 대해서 어떻게 구현해야할지 모르니 DB설계가 어떻게 되야 하는지 잘모르겠어서 어느정도 윤곽만 잡아놓았따
    • 푸시 알람기능에 대해서도 더 공부를 해야 좀더 명확한 DB설계가 딜 것 같다
  • 결국은 도메인에 대한 이해가 있어야 DB가 나오는 것 같은데 새로운 도메인이 많다보니 공부를 먼저진행하면서 해야되지 않나 싶었다

스프링 강의

인텔리제이활용

  • 스프링 실습이 끝나고 새로운 강의를 찾던중 패스트캠퍼스에서 제공한 스프링강의를 활용해보고자 하여 둘러보던 중 자바 끝난 후 인텔리제이 활용에 관한 강의가 있어서 관심이 생겨 몇강의를 들어보았다

인텔리제이 단축키

  • 인텔리제이 단축키와 편의기능들을 설명한 강의였는데 아는것도 많았지만 유용한 단축키들이 많아서 도움이 되었다

  • 단축키 목록 정리

    • 프로젝트창 미리 보기 - Space

      • 프로젝트창에 포커스가 있는 상황에서 클래스 내용을 작은 창으로 미리확인할 수 있다
    • 다른창 최소화하기 - Shift + ESC

      • 에디터 창외에 다른창을 최소화할 수 있는 단축키
    • 에티터 창 키우기 - Ctrl + Shift + F12

      • 에이터창을 최우선으로 최대화한다
    • 에디터 창 이동 - Ctrl + Tab

      • 기존에 Alt + 방향키보다 편하게 에디터창을 이동할 수 있는것 같다
    • 에디터창 닫기 - Ctrl + F4

      • 개별 에디터창을 닫을 수 있다
    • 새파일 생성 - Ctrl + Alt + Insert or Alt + Insert

      • 에디터창에 같은 디렉토리에 파일생성은 컨트롤을 활용하면 된다
    • 자동 인덴트 - 블록설정 이후 Ctrl + Alt + I

      • 다른 코드 변경없이 인덴트만 설정할 수 있다
    • 사용처 찾기 Alt + F7 , 빠른 찾기 Ctrl + B

      • 알트는 정식적으로 새로운창이 뜨고 Ctrl은 컨트롤 클릭과 같이 간단한창으로 뜬다
    • 경로내 검색 , Ctrl + Shift + F

      • 그냥 검색보다 창이 뜨면서 좀더 정식적인 찾기 기능
    • 전체 검색, Shift 2번

      • 인텔리제이 기능 포함 모든걸 검색할 수 있다
    • 최근 파일 열기 - Ctrl + E

      • 최근 파일을 리스트로 보여주는 유용한 단축키
    • 라이브템플릿 - Ctrl + J

      • 사용가능한 템플릿이 리스트로 제공
    • 코드 이슈별로 이동 - F2, Shift + F2

    • 이슈단위로 이동가능한데 모든 작성 끝나고 이슈들이나 문제들 찾기에 편리한 기능같다

    • Imort 최적화 - Ctrl + Alt + O

      • 안쓰는 임포트가 자꾸남았는데 습관적으로 사용하면 좋을 것 같은 단축키
    • 코드 생성 - Alt - Ins

      • 알던건데 사용을 안하니 까먹고 있던 기능, 게터세터, 컨스트럭터 생성때 꼭사용하기
    • 터미널창 - Alt + F12

    • 구문완성 - Shift + Ctrl + Enter

      • 코드 다치고 끝에 부분 완성시킬때 활용하면 편할 것 같다
    • 대체하기 - Ctrl + R

    • 찾아 바꾸기 같은 기능, 현재쓰는 Shift + F6이 나아보임

    • 파라미터 정보 - Ctrl + P

      • 메소드 명위에서 사용하면 파라미터 정보를 알 수 있는 유용한 기능
    • Quick Definition - Ctrl + Shift + I

      • 메소드의 구현을 찾아가지 않고도 볼수 있는 핵 편한 기능..
    • Quick Document - Ctrl + Q

      • 메소드 명위에 커서를 올리면 뜨는 자바덕를 단축키로 편하게 볼수 있다
    • 기능(action)찾기 -> Shift + Ctrl + A

      • 기능을 찾을 수 잇는 단축키 -> 기억안날때는 찾아라도 써보자
    • 테스트코드 이동 - Ctrl + Shift + T

      • 해당 메소드에 테스트코드로 이동 가능하다
    • 리팩토링 - F6

      • 클래스명 위에서 F6을 해주면 이동가능하다
    • 리팩토링(타입변경) -> Ctrl + Shift + F6

      • 기존에는 클래스명만 변경했는데 이것 통해서 타입 또한 일괄적으로 변경 할 수 있다
    • 메소드시그니처 병경 - Ctrl+F6

      • 접근제어자, 리턴타입, 이름까지 메소드의 모든걸 바꿀수 있는 창이 뜸
    • 리팩토링종합 -> Ctrl + Alt + Shift + T

      • 모든 리팩토링 관련한 메뉴가 뜨는 단축키
    • 디버깅 - 브레이킹포인트설정 -> Ctrl + F8

    • 디버깅 모드실행 -> Shift + F9

    • Git - > Alt + `

      • 깃관련 기능이 리스트로 뜸
    • KeyMap에서 단축키 수정가능

  • 단축활용은 생산성에 영향을 주는 것이기 때문에 활용할 수 있다면 무조건 단축키를 활용하도록 노력하면서 연습을 해나가야될 것 같다

알고리즘 문제 풀이

로프

  • 문제 해석

    • 여러개의 로프를 연결해서 하나의 물건을 들어올릴 때 각 로프가 받는 힘은 w (중량) / k(로프의 개수) 가 된다. 여러개의 로프가 주어질 때 들어울릴 수 있는 최대의 무게를 구하라
      • 로프를 모두 활용할 필요는 없다..
  • 풀이 계획

    • 각각 받는 무게를 I라고 했을 때 I K = W가 된다. 여기서 최대무게는 최소 무게를 들 수 있는 로프의 무게 K를 하면 된다
    • 로프의 무게를 오름차순으로 정렬한뒤 가장 가벼운것 부터 해서 최대무게를 구하고 다음은 2번째로 무거운 로프와 k-1를 곱해 그다음 무거운 무게를 구해가면서 무게가 더 낮아지면 멈추고 이전 최대 무게를 출력하면 될 것 같다
  • 나의풀이

    • 계획에서 생각했던 것 처럼 처음으로 무게가 역전된곳에서 라고 상정하여 풀었을 경우 오답이었고 전체를 탐색하였을 때 정답이 나왔다
      • 무게가 증가하다가 감소하면 거기서부터 분기점이라고 생각했는데 다시 증가하는 경우도 있을 수 있었던 것 같다
    • 계획에 근거가 부족했던 것 같고 전체탐색을 기본으로 두되 정말 명확한 근거에 의해서 줄여나가는게 더 좋은 방법인 것 같다
  • 다른사람풀이

    • 풀이는 비슷했지만 그리이 알고리즘으로 보고 접근한 풀이가 많아서 그리디알고리즘에 대해서 찾아보았다

    • 그리디 알고리즘은 당장 눈앞에 보이는 최적의 상황만을 쫓는 알고리즘으로 단순한 형태의 알고리즘이기에 항상 최적의 해를 도출하는 것은 아니지만 어느정도의 최적의 해에 근사한 값을 빠르게 구할 수 있다는 장점이 있다

      • 특정 상황에서는 항상 최적의 해를 구하기도 한다
        • 동적 거슬러줄때 가장 적게 주기위해서는 항상 큰 동전부터 거슬러주면 된다는 예가 그 예이다
      • 무조건 큰경우대로, 아니면 작은경우대로 같은 단순한 조건을 이용하여 접근하는 알고리즘으로 정렬 기법이 함께 사용되는 경우가 많다
    • 이번 문제에서 가장 작은 것으로 정렬하고 가장작은 것 * 갯수로 접근한 것 자체가 그리디 알고리즘으로 접근한 방식이 된 것 같다

    • 참고 : https://www.youtube.com/watch?v=PNPIk3hc6ic

숫자카드2

  • 문제 해석
    • N그룹의 숫자카드에서 숫자 그룹 M에 숫자들이 몇개나 포함되어있는 차례대로 출력하라
      • 숫자 6이 N그룹의 6개 있다면 6을 출력하는 것을 반복한다
  • 풀이 계획
    • 카운터정렬법
      • 숫자 그룹 N을 카운터 정렬해서 숫자 M을 인덱스로 출력해주면된다
      • 단점은 숫바의 범위가 너무커서 배열의 크기가 엄청나게 커지는 단점이 있다
    • 정렬후 이분탐색법
      • 먼저 N을 오름차순으로 정렬후 숫자m을 이분탐색으로 찾는 방법인데 이 방법은 찾은 숫자가 가장 첫째줄에 있어야 의미가 있는 것 같아서 적용하기 어려워 보인다
  • 나의풀이
    • 배열의 크기가 부담스럽지만 연속된 숫자를 다루기에는 카운터 정렬만한게 없어서 카운터 정렬로 풀이를 하였다
    • n의 범위가 +- 10000000이었기 때문에 배열의 크기를 20000001으로 주어서 0을 기준으로 천만씩이 되도록 하였다
    • n과 m을 입력받아 + 10000000을 하여 index로 활용하여서 음수와 양수를 모두 커버하였다

회전하는큐

  • 문제풀이
    • 양방향 큐에 1~n까지의 값이 들어가 있고 큐를 왼쪽이나 오른쪽으로 돌려서 원하는 값을 뽑는다고 할때 원하는 값을 모두 뽑으면서 이동한 횟수를 출력하라
  • 풀이계획
    • N만큼의 boolean 배열을 선언한 후 index 0을 기준으로 원하는 값이 될때까지 왼쪽으로 이동시키고 오른쪽으로 이동시킨 count를 구한다
    • 둘중 작은 수의 count을 sum에 합한뒤 값이 빠진것을 표시하기 위해 해당 index를 true로 변환한다
    • 해당 index +1을 기준으로 다시 이동한 값을 구하는 것을 반복한다
  • 나의풀이
    • index 0을 무시하고 1~n까지의 범위를 사용하기 위해 n+1만큼의 배열을 선언하고 1~N까지를 true로 선언하였다
    • 뽑는 갯수인 m만큼 반복하도록 하여 값을 하나씩 받아와서 왼쪽오른쪽으로 이동하며 더작은값을 찾아서 합쳐주었다
      • index를 --하거나 ++하여 값이 ture일때만 count를 ++해주고 false면 그냥 넘어가도록 하여 이미 제외된 값을 count에서 빼주었다
    • 마지막으로 처음시작값이 입력된값 +1이 되도록해주고 입력이 끝날때까지 반복해주었다
      • 만약 전체를 다 돈다면 구지 값을 찾을 필요가 없기 때문에 처음시작값은 m-1보다 작을때만 찾고 m-1에서는 구지 찾지 않도록 하였다
  • 다른사람풀이
    • 직접 구현하지 않고 실제로 덱을 사용하여 푸는 문제가 있었다
      • LinkedLIst로 구현하면 pollFirst, pollLast, offerFirst, offerLast 메소드를 통해 자연스럽게 덱으로 구현할 수 있음을 배웠다
      • 뽑고자하는 값이 현재 덱의 중앙값보다 앞에 있으면 2번 을 수행하고 뒤에있으면 3번을 수행하는 방식으로 두가지 경우다 비교하지 않고도 연산할 수 있었다
        • LinkedList에 indexOf 라는 메소드를 통해 목표 index를 알 수 있었다
    • 참고 :https://st-lab.tistory.com/216

듣보잡

  • 문제풀이

    • n개의 이름이 나열되고 m개의 이름이 나열될때 중복되는 이름의 수를 출력하고 그 이름들을 사전순으로 출력하라
  • 풀이계획

    • n+m 사이즈의 배열을 만들고 모든 이름을 배열에 넣은다음 오름차순으로 정렬한뒤 for문을 통해 중복된 것만 count하면서 출력해준다
  • 나의풀이

    • 계획처럼 풀이하되 2개가 나온 경우 counter를 ++하고 StringBuilder에 그값을 차례대로 출력하고 마지막에 couter를 먼저 출력하고 StringBuilder를 출력하면 순서대로 출력할 수 가 있었다
  • 다른사람풀이

    • set을 이용해 먼저 n을 모두 set에 넣은뒤 m을 순회하며 contains를 활용해 이미 있는 값이면 답으로 제출할 배열에 추가해주는 식으로 문제를 풀어나갈 수 있었다

내일 할일

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

0개의 댓글