20210323-TIL

나영원·2021년 3월 24일
0

T.I.L.

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

오늘 할일

  • 채용공고 읽기

  • 알고리즘 문제 풀기

  • 기술면접 준비

오늘 한 것 & 배운 내용

알고리즘 문제 풀이

  • 명령 프롬프트
    • 내풀이
      • 다행히 비교하는 파일의 길이가 같아서 한글자씩 뽑아서 비교해서 다르다면 ?로 바꿔주면 될거 같아서 그렇게 풀었고 통과하였다
    • 다른사람풀이
      • 나와 비슷하게 풀었지만 나처럼 String의 글자를 만드는 대신 새로운 String에 char을 하나씩 추가해주는 방법으로 푸는게 더 성능이 잘나왔다
  • 완전제곱수
    • 내풀이
      • 1부터 완전 제곱을 해가면서 그값이 M과 N사이에 있는지 확인을 하면서 그 합과 최소값을 구했다
        • 합이 0이라면 완전제곱이 없는 걸로 간주하고 -1을 출력하였다
    • 다른사람풀이
      • 탐색의 범위를 1부터 제곱을 해간게 아니라 M의 제곱근을 올림한수(Math.ceil(Math.sqrt(M)))부터 Math.floor(Math.sqrt(N))으로 두어서 탐색시간을 줄였다
        • 처음에 이렇게 풀어보고 싶었는데 제곱근을 생각을 못해서 이런방식으 풀지를 못했는데 도움이되었다
        • Math 함수들을 잘기억해두면 이런 수학문제에는 도움이 많이 될 것 같다
      • 풀이 : https://mizzo-dev.tistory.com/entry/baekjoon1977

세로읽기

  • 내풀이

    • 한문자열 당 최대길이가 15개 이니까 15개 짜리 String 배열을 만들고 문자열에서 각 자리수에 해당하는 char를 뽑아서 해당 배열에 값에 더해주는 방법으로 풀었다
      • String 배열은 null로 초기화 되기때문에 맨처음에 한번 배열을 ""로 초기화 시켜줄 필요가 있었다
    • 더해진 배열을 순차적으로 print하면서 null 이면 반복문을 멈추게해서 값이 있는 곳에만 출력이 되도록 설정을 하였다
  • 다른사람풀이

    • 먼저 입력된 문자열을 배열에 넣은다음 배열을 세로방향에 index순으로 읽어나가는 방식으로 문제를 해결했다

      • 단순하지만 내가 한것보다 더 좋은 해결방법인 것 같다

      • 자꾸 한번에 풀어보려고 하다가 오히려 구현이 더 꼬이는 것 같으니 일단 정방향으로 생각하고 더 줄일수 있는방향을 생각해보는게 더 좋은 접근이 될 수 있을 것 같다

팰린드롬인지 확인하기

  • 내풀이
    • 입력값을 StringBuilder로 만들어 reverse하여 앞에 글자들을 비교하기로 계획하였다
      • substring을 하여 반을 자른값과 reverse하여 반을 자른값이 같으면 true가 나오도록 구현을 하고 싶었다
      • StringBuilder에도 substring()이 있는 것을 배웠다
  • 다른사람풀이
    • 내 풀이와 비슷하지만 나처럼 구지 앞에를 잘라서 비교할 필요없이 reverse() 한 값과 원본 값을 단순히 비교만 해주어야 되는 문제였다
      • 정의 자체가 거꾸로 돌려도 같은 것이기 때문에 그대로 살려서 생각을 했으면 되는 문제였던것 같다
    • Stringbuilder 객체에 .eqeal해서 reverse()한 객체랑 비교를 했더니 무조건 true가 나와서 toString으로 변환한 후에 비교를 해주어야 했다
      • 이유를 찾아보니 Stringbuilder 클래스는 오버라이드된 equals를 지원하지 않는다는 설명이 있었다

ROT13

  • 내풀이

    • 입력받은 String의 char를 하나씩 꺼내서 A~Z에 해당하는지 a~z에 해당하는지 구분해서 +13을 해준다

    • 해당값이 'Z'나 'z'를 넘어가면 13을 더하지 않고 13을 빼주기 위해 -26을 한다

      • 13을 빼주는 의미는 알파벳은 26자리이기 때문에 +13이 Z를 넘어가능 경우 -13을 해주면 원하는 값으로 이동하기 때문이다
    • 변경된 값을 하나씩출력한다

      • 숫자인경우 조건문을 거치지 않아 그대로 출력되게된다
    • 성능을 높이기 위해 StringBuilder를 사용하던 것을 제거하거 그냥 print 해보았지만 동일한 성능이 나왔다

      • print 하던 것을 제거하고 BufferedWriter를 사용해보았는데도 동일한 성능이 나왔다..
      • StringBuilder를 추가하고 BufferedWirter를 통해 출력해보았는데도 동일한 성능이 나왔다..
      • 오히려 StringBuilder를 통해 값들을 등록하고 println했을 때 가장 좋은 성능을 보였다..
        • char를 각각 print하는 것보다 StringBuilder로 합쳐서 한번에 print하는게 성능에 도움이 된다
        • BufferedWriter로 출력할게 많지 않은 이상 그냥 print하는게 더 성능에 도움이 된다
    • 문제를 풀기전에 알파벳은 공책에 쭉 나열했는데 그게 문제풀기에 도움이 많이되었다..

  • 다른사람풀이

    • 내풀이와 크게 다르지 않아서 다음문제로 넘어갔다

행렬곱셉

  • 내풀이

    • 먼저 행렬 A를 2차원 배열로 입력하고 행렬 B를 2차원 배열로 입력하여 행렬에 곱셈 공식을 따라 두개를 곱해주어 새로운배열에 입력하고 출력하였다
    • 마지막 행렬의 곱셉에서는 3중첩 for문을 썻어야 됬는데 2차원으로만 자꾸 생각하다보니 시간이 오래걸렸다
    • 성능을 올리기 위해 마지막 출력하는 for문을 없애고 곱셈에다가 로직을 합쳤는데 오히려 성능이 떨어져서 다시 분리해두었다
  • 다른사람풀이

    • 수학문제라 그런지 내풀이와 크게 다르지 않아서 다음문제로 넘어갔다
      • 정직하게 풀지 않고 무엇인가 더 효율적인 방법은 없을까 고민하게 되지만 이미 최적화되어 있는경우도 많은 것 같다
  • 기초문제를 계속 반복해서 풀고 있는데 쉬운 유형들이 쌓이고 쌓여서 다음 레벨에 문제풀때 분명히 도움이 될것이라고 생각하기 때문이다

    • 과거의 수학공부할 때 기초문제는 많이 풀지 않고 공식만 외우고 어려운문제를 접했을 때 제대로 풀지 못했던 경험을 되돌아보며 마음은 급하지만 기초부터 쌓아올리자는 마음으로 공부하고 있다

진법변환(https://www.acmicpc.net/problem/11005)

  • 내풀이

    • 기다리전 진수 변환법 문제가 나와서 이번엔 Integer method를 사용하지 않고 직접구현해보려고 알고리즘을 찾아봤다

      • https://hongjw1938.tistory.com/43
      • 해당 진수로 나누기 위해선 10진수를 해당 진수로 나누고 나머지를 1의자리부터 채워주는 방식으로 반복하면 됬다
    • 입력값을 입력받아 while문으로 나누어야 할 값이 0이상 일때만 돌아가게해서 계속 나눈 나머지 값들을 StrinBuilder로 합쳐서 마지막에 .rever()로 출력해주었다

      • 나머지가 10이상일때는 알파벳으로 변환해주는 로직이 중간에 추가되었다

      • val > 0 조건을 찾는데 시간이 걸렸는데 맨마지막에 몫을 출력해주어야 한다고 생각했기 때문이다

      • 그냥 몫이 0일때 똑같이 나머지를 출력해주면 해결이 가능한 문제였다

  • 다른 사람 풀이

    • 출력될 수 있는 나머지가 0~ Z까지 모두 포함된 char[]을 만들어 나머지를 구한 값을 index로 하여 출력하는 방법도 있었다

채용공고 읽기

  • 용어정리

    • UBIQUITOUS LANGUAGE

      • DDD(Domain Driven Development)에 중요한 요소중 하나
      • 도메인 어휘를 이해관계자들이 공통적으로 의미를 이해할 수 있도록 정의하는 것
        • 대화, 문서, 코드 등 모든 곳에서 사용하여 의사소통의 복잡성을 줄이는 역할
      • DDD를 잘모르고 있기 때문에 아직 확 와닿지는 않지만 그래도 공통의 언어를 사용하는 것이 중요하고 그렇기 때문에 명명에 고심해야 한다라는 뜻으로 일단 정리를 해보았다
      • 참고
    • Jira

      • 이슈 기반의 프로젝트 관리 도구

        • 프로젝트를 이슈의 집합으로 이해하여 이슈의 발견, 상태, 책임, 작업현황 등의 관리 기능을 제공
      • 프로젝트를 하며 Github Milestone과 Projects로 이슈관리를 진행해보았는데 Jira는 훨씬 체계적인 이슈관리기능 들을 제공한는 것 같다

        • 자료 본문에 이슈를 관리하였을 때 장점으로 이미 해결한 것과 비슷한 이슈가 발생했을때 처리과정을 되짚어 볼 수 있는 자산이 된다고 써있었는데 프로젝트를 진행하다보니 비슷한 이슈가 발생하는데 잘기록이 안되어있어서 답답했던 기억이 떠올라 중요한 장점이라고 생각이 들었다
      • 참고

입사 지원 하기

  • 아침에 처음 이력서 지원곳에서 답신이 왔는데 서류 전형에서 탈락했다는 답장이 왔다
    • 떨어진게 신경이 쓰이는 것 보다는 일단 확답이 왔다는 것에 뭔가 마음이 놓였다
    • 지금 떨어진게 내 이력이 부족해서인지 아니면 이력서/자기소개서/포트폴리오의 문제인지 궁금하였다
      • 합격 여부로만 결과가 나오니 어떻게 피드백을 해야될지 잘모르겠는게 사실이다..
      • 이부분은 조금더 결과를 지켜보다가 서류합격률이 너무 낮으면 형식을 수정하는 걸로 결정하기로 하였다
  • 데이터 라벨링 관련 기업에 지원하기위해 조사를 하면서 데이터 라벨링 산업과 교육을 통해 데이터 라벨러로 활동할 수 있다는 점이 굉장히 흥미로웠다
    • AI 관련 서비스는 계속 성장할 수 밖에 없기 때문에 이런 도메인들을 이해하고 있는 것은 도움이 많이 될 것 같다

기술 면접 준비

  • 프로그래밍 공통

    • 동기와 비동기의 차이

      • 데이터 처리모델(데이터를 받는 방식)
- 동기(Synchronous) 방식

  - 요청을 보내고 실행이 끝나면 다음 동작을 처리하는 방식
  - 순서에 맞추어 진행되기 때문에 제어하기 쉽다.
  - 콜센터 직원의 처리하는 방식

- 비동기 방식

  - 요청을 보내고 해당 동작의 처리 여부와 상관없이 다음 요청이 동작하는 방식

  - 작업이 완료되는 시간을 기다릴 필요가 없기 때문에 자원을 효율적으로 사용할 수 있다

  - 작업이 완료된 결과를 제어하기 어렵다

  - 비동기 방식의 예제로는 이메일이 있다. 

    
  • MSA란?

    • Microservice Architecture는 모든 시스템의 구성요소가 한 프로젝트에 통합되어 있는 Monolithic Arcitecture의 한계점을 극복하고자 등장했다
      • MSA는 1개의 시스템을 독립적으로 배포가능한 각각의 서비스로 분활한다
      • 각각의 서비스는 Restful API를 통해 데이터를 주고 받으며 1개의 큰 서비스를 구성한다
    • 장점
      • 일부 서비스에 장애가 발생하여도 전체 서비스에 장애가 발생하지 않는다
      • 각각의 서비스들은 서로 다른 언어와 프레임워크와 DB로 구성될 수 있다
        • 팀 단위로 기술스택을 다르게 가져갈 수 있다
      • 서비스의 확장이 용이하다
      • 서비스별로 독립적으로 배포가 가능해 배포시간이 짧다
      • 부분적으로 scale-out이 가능하여 성능상으로 이득이 된다
    • 단점
      • 서비스가 분리되어 있어 테스팅이나 트랜잭션 처리 등이 어렵다
        • 상대적으로 운영 복잡도가 증가한다
      • 서비스 간에 Restful API로 통신하기 대문에 그에 대한 비용이 발생한다
        • 통합 테스트가 어렵다''
  • 참고 자료

내일 할일

  • 채용공고 읽기

  • 입사 지원하기

  • 알고리즘 문제 풀기

  • 기술면접 준비

profile
배우는 개발 일기
post-custom-banner

0개의 댓글