20210408-TIL

나영원·2021년 4월 9일
0

T.I.L.

목록 보기
138/145

오늘 할일

  • 알고리즘 문제풀이
  • 스프링 개발 실습
  • 포트폴리오 수정
  • 채용공고 읽기

오늘 한 것 & 배운 내용

알고리즘 문제 풀이

다리놓기

  • 문제 해석
    • 서쪽에 N개의 사이트가 있고 동쪽에 M개의 사이트가 있다. 서쪽으로부터 동쪽으로 다리를 놓을 수 있는 방법을 구하라
      • N<=M 이고 다리는 서로 겹칠 수 없다
  • 풀이 계획
    • 지난 번 못풀었던 문제에 복습이라 풀이방법이 바로 떠올랐다
    • M개에서 N개를 겹치지 않게 뽑는 조합에 문제로 MCN를 풀어가면 된다
    • 점화식을 만들고 DP를 이용해서 연산을 최대한 줄여준다
      • 점화식은 MCN = M-1CN-1 + M-1CN 이란 성질과 nCn =1, nC0 =1이라는 성질을 이용한다
  • 나의풀이
    • 테스트 케이스 갯수 마다 각각 N과 M을 입력받는다
    • dp배열을 만들고 테스트 케이스마다 초기화되도록 한다
    • 재귀함수 combination을 만들고 combination(n-1 , k-1) + combination(n-1, k) 의 결과를 dp[n][k]에 저장하며 return되도록한다
      • 다음 재귀함수가 돌기전 dp[n][k]에 값이 있다면 바로 그값을 return하도록 하여 연산횟수를 줄여준다
  • 다른사람풀이
    • 기존에 풀었던 예제를 다시보니 dp 배열을 테스트 케이스마다 초기화 하는 것이 아니라 선언할때 한번만 n과 k의 최대범위만큼 크기로 생성해놓았다
      • 테스트케이스와 상관없이 dp의 값들은 공통으로 사용할 수 있었고 그건 테스트케이스 사이에서도 결과값의 공유가 일어나 연산속도가 더 늘어날 수 있음을 뜻했다
        • 단순히 한번반복이 아닌 여러번 반복해서 사용할 수 있는 데이터들이 쌓여간다는 점이 내 방법 보다 훨씬 더 좋은 접근이라고 생각했다
  • 느낀점
    • 지난번에 못풀었던 문제를 다시 풀었는데 술술 풀려서 기분이 좋았다.
      • 앞으로도 못 푼문제들을 모아놓고 계속 반복해서 풀면서 그 유형을 내것으로 만들어야겠다

집합

  • 문제해석
    • 공집합 S가 주어지고 add, remove 등의 명령어가 주어졌을 때 주어진 명령어들을 수행한 결과값을 출력하라
  • 문제 풀이
    • 공집합 S를 어떤 자료구조로 해야 좋을지 고민을 먼저 했다
      • x가 있는지없는지 체크를 해줘야 하고 중복값을 무시해야되니 map을 이용해서 같은 값을 key와 value 모두 사용하면 편하게 해결이 될 것 같다
      • 그런데 이러면 직접 구현할 게 너무 줄어들어 푸는 의미가 없으니 배열로 만들어 푸는 것도 좋을 것 같다
    • 명령어 + 숫자 or 명령어 2가지 타입으로 입력이 들어오는 것을 어떻게 해결해야 하는지 고민 했다
      • StirngTokenizer을 이용하고 첫번째 값은 nextToken()으로 받고 두번째 값은 hasMoreToken()으로 확인한뒤 받는 것으로 해결 가능할 것 같다
    • 명렁어들을 Switch~Case 문을 통해 처리하면 가독성이 올라갈 것 같다
      • 따로 메소드를 만들면 더 좋을 것 같다
  • 나의풀이
    • 크기가 20인 boolean 배열을 만들고 각 인덱스를 입력받은 값처럼 사용하면서 들어가있는지 여부를 true/false로 표기하도록 하였다
    • Switch Case문을 통해 각 상황별로 배열을 체크하여 알맞은 값이 오도록 하였다
      • all과 empty의 경우 Arrays.fill() 메소드를 이용하여 편리하게 구현할 수 있었다
    • Switch Case문의 결과로 출력값이 있는 경우에만 출력되도록 하였다
  • 다른사람풀이
    • 참고 : https://dragon-h.tistory.com/28
    • 배열이 아닌 비트마스크를 이용하여 공간복잡도를 줄이는 방식으로 풀어나갔다
      • 배열에 index를 int에 2진수 자리수로 표현한 것이다
    • 오랜만에 비트연산자를 사용해서 복습을 한뒤에 문제를 다시 풀어봤다
    • 나의풀이
      • AND XOR Shift 등의 해깔리는 비트연산자를 복습해볼 수 있는 좋은 기회였다

스프링부트와 AWS로 혼자 구현하는 웹서비스

AWS 서버 환경 구축

  • 참고 : https://velog.io/@swchoi0329/AWS-%EC%84%9C%EB%B2%84-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95

  • 기존에 사용했던 우분투 환경이아닌 Amazon Linux 환경으로 설정하는거라 기대를 가지며 실습을 하였다

  • 인스턴스를 생성하고 네트워크 및 보안 탭에 탄력적 IP를 할당해주었다

    • 인스턴스에 고정 IP를 주는 방법이 이렇게 쉬운지 알았다면 당장 지난 프로젝트부터 했을 것 같다..
    • 주의할점은 탄력적 IP를 받는것 자체는 비용이 들지 않지만 인스턴스가 연결되어있지 않다면 요금이 부과되니 인스턴스 종료시 함게 해재해야할 것 같다
  • windows 에서 ssh 연결을 쉽게 할수 있게 도와주는 putty라는 프로그램을 다운로드해서 사용해보았다

    • pem파일을 ppk파일로 변환해서 유저네임@고정아이피 + ppk파일을 사용하면 바로 ec2에 연결된 터미널창이 뜨게된다
      • 그냥 터미널에 타이핑하는거랑 크게 차이가 없긴한데 그래도 설정을 저장해놓고 사용할 수있어서 나름 편한것 같다
    • 실습시 계속 사용하다보니 기본적인 세팅을 값을 저장해 놓고 쓸수 있어서 처음 생각했던 것보다 더 편하게 느껴졌다
  • 서버 기본 설정

    • java8 설치 , 타임존 변경, HostName 변경을 해주었다
      • HostName은 ec2-user@아이피주소에서 ip주소를 특정한 이름으로 변경하게 해주는 것이었다
        • 현재 어떤 서버에 접속해있는지 확인할 수 있는 역할을 하는 것 같다
      • 참고한 글에 정보가 부족해서 검색을 해봤는데 AWS 답변이 상세하게 잘나와있어 수월하게 진행할 수 있었다

AWS 데이터베이스 환경 구축

  • AWS RDS를 세팅하여 서버 배포 환경을 만드는 작업

  • 참고 : https://velog.io/@swchoi0329/AWS-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95

  • RDS 인스턴스 생성하기

    • EC2인스턴스를 생성 하듯이 RDS 인스턴스도 각종 세팅을 통해 생성할 수 있었다
    • 먼저 db종류를 고르는데 실습에서는 MaridDB를 선택하였다
      • MaridDB는 MySQL에 오픈소스버전으로 완벽히 호환되며 조금더 많은 기능을 가졌다고 한다
    • 계정과 비밀번호, 연결 방식등을 설정해준다
  • RDS 운영환경에 맞는 파라미터 설정

    • 파라미터 그룹을 생성하고 character_set , 타임존 같은 세부설정들을 설정하다
    • 만든 데이터베이스의 파라미터 그룹을 새로만든 파라미터 그룹으로 변경한다
    • 파라미터 그룹을 통해 DB에 기본설정을 함께 공유할수있는 그룹을 관리할 수 있는 것 같다
  • 내 PC에서 RDS 접속

    • RDS 보안그룹에 자기자신의 3306포트로 들어오는 자기자신의 ip와 EC2를 추가해준다
      • EC2는 EC2가 사용하고있는 보안그룹 id를 복사하여 붙여넣는식으로 적용을 하였다
    • 인텔리제이에 Database 기능을 이용하여 host, user password 같은 정보를 입력하여 RDS와 연결테스트를 하였다
      • 처음에 db종류를 Maridb로 선택하고 연결했는데 연결은 잘되는데 Schema등 정보가 뜨지 않아 MySQL로 변경하여 접속하였더니 잘되었다
      • 기본설정을 다시확인하여 수정한 후 테이블 생성 및 Insert등으로 간단히 테스트를 해보았다
  • EC2에서 RDS 접속

    • putty로 띄워놓은 터미널에서 mysql을 install하고 mysql -u 계정 -p -h host주소 명령어를 통하여 rds에 접속하였다

      • 과정을 다시 생각해보면 내 서버에서 mysql을 설치하여 다른 서버에있는 데이터베이스에 접속해서 작업을 하는 것이 었다
  • 배운점

    • RDS를 사용하는게 EC2인스턴스에 올리는 것과 크게 다르지 않아서 금방 적을 할 수 있을 것 같다
    • Intellij에서 편하게 DB에 접속할 수 있는 방법을 배워서 프로젝트진행할 때 편하게 활용할 수 있을 것 같다
    • Mariadb가 mysql을 완전히 대체할 수 있기 때문에 편하게 사용해도 된다는 것을 배웠다

EC2 서버에 스프링부트 배포

  • 신나게 실습을 따라하며 진행하고 있었는데 거의 최종부분에서 배포가 안되고 있었다는걸 확인했다..
    • 실습환경에 비해 내 환경이 최신이라 안맞는게 있는 것 같아서 변경을 해줘야 될것 같아서 찾아봤더니 책의 저자가 업데이트한 내용이 있어서 그 부분을 보충해보려고 한다
      • 시간관계상 내일 이어서 업데이트 한 이후에 내용정리 및 배운점을 정리해 보겠다.
    • 사실 중간에도 테스트를 해봤는데 잘안되서 걱정이 됬는데 설마 끝까지하면 되겠지하고 무시하고 한게 화근이 된것 같다
      • 개발은 항상 테스트와 함께 이루어져야 한다는걸 다시한번 생각하게 된다

내일 할일

  • 알고리즘 문제풀이
  • 스프링 개발 실습
    • 어제 실습한 내용 디버깅 우선
  • 포트폴리오 수정
  • 채용공고 읽기
profile
배우는 개발 일기

0개의 댓글