20210326-TIL

나영원·2021년 3월 26일
0

T.I.L.

목록 보기
131/145

오늘 할일

  • 이력서 수정

  • 알고리즘 문제풀이

  • 채용공고 읽기

오늘 한 것 & 배운 내용

이력서 & 자소서 작성

  • 어제 저녁에 받은 피드백을 바탕으로 오전시간에 이력서와 자소서를 수정해보았다

    • 경력사항을 깔끔하게 기간만으로 정리해주시고 따로 간단하게 경럭 스토리를 작성하라고 하셔서 정리해보았다
      • 관련 경력이 아니라 이렇게 간단하게 정리하는게 더 좋아 보인다
    • 입사 후 포부에 관해 주요 업무에서 뽑아서 더 구체적으로 작성하라는 받았는데 프로젝트 경험과 더불어 어떻게 이걸 잘 조화시켜야되나 고민을 많이하게 되는 부분이다
      • 그렇기 때문에 주요업무에 따라 적절한 프로젝트 경험을 사용하는게 더 좋은 방법이 될 수 있는 것 같다
      • 해당 공고에는 주요업무 사항이 하나밖에 없어서 기존에 작성했던 것에 덧 붙여서 작성해 보았다
    • 해당 내용을 다시 피드백 받기위해 전송했으니 피드백을 받으면 오후에 추가 수정을 하여 제출하면 더좋을 것 같다
  • 오전에 이력서에 대한 피드백을 전화통화를 통해 받을 수 있었다

    • 이력에 관해 감추고 있는 듯한 인상을 받으며 아직 기업에 대해서 자신이 왜 해당 기업을 가야하는지에 대한 명확한 이유가 나오지 않고 있다고 피드백을 주셨다
      • 아직 자신에 대한 분석과 정리가 잘되지 않은 부분들이 이력서에 보여지고 있는 것 같아서 더 도전이 되는 것 같다
    • 더 이상의 피드백은 없고 지금 까지 받은 것들을 가지고 스스로 발전시켜나가라는 이야기를 들어 조금 막막하게 느껴지기도 했으나 지금까지 봐주신 것도 감사하는 마음을 먹고 이제부터는 스스로 발전시켜나가도록 해야될 것 같다

알고리즘 문제 풀이

수 정렬하기2

  • 어제 풀이를 보니 퀵정렬 구현을 잘못 한 부분이 있어 다시 작성하고 제출해보았는데 여전히 시간초과가 발생하였다

    • 여기서부턴 도움을 받아야 된다고 생각하여 질문게시판에 들어갔고 카운팅 정렬을 사용해보자는 힌트를 얻었다
  • 내풀이

    • 백만까지의 값을 정렬해야 하기 때문에 boolean[1000001]을 만들어서 해당 값이 있는 곳만 true로 만들고 ture인 index만 출력해주는 방식으로 정렬을 해보았다

      • 이렇게 정렬하니 계속 ArrayOutOfBound 에러가 떠서 왜그런지 다시 문제를 읽어보니 정렬하는 수의 범위가 정수여서 음의 정수와 0을 고려해주었어야 됬다
        • 그래서 음의 정수를 위한 배열을 하나 더 만들어서 입력값이 음수인지 양수인지 판단하여 각각의 배열에 값을 ture로 바꿔주고 음수배열 먼저 역순으로 출력하고 양수를 0을 포함해서 출력하여서 문제를 해결할 수 있었다
    • 카운팅 정렬은 이미 사용해본 방법인데 떠올리지 못해서 아쉬웠고 문제를 제대로 읽지 않아 정렬하는 값의 범위를 잘모르고 있던것은 기본적인 실수르 반성이 되었다

  • 다른사람풀이

    • 참고 자료 : https://st-lab.tistory.com/106
    • Array.sort는 dual -pivot QuickSort를 사용하는데 이번 문제는 QuckSort의 최악의 경우의 시간복잡도인 O(n2)이 걸리는 데이터가 있어서 통과하지 못했다고 한다
      • Collections.sort는 Timsort를 사용하는데, 이 알고리즘은 합병 정렬의 최악인 O(nlogn)을 보장하고 삽입정렬의 최선인 O(n)을 보장하는 알고리즘으로 시간복잡도O(n) ~ O(nlogn)을 보장하는 장점이 있다고 한다
      • 그래서 Collections.sort로 풀면 손쉽게 문제를 해결할 수 있다
    • 카운팅 정렬로도 풀이를 해주셨는데 나와 같이 배열을 2개만드는 것이아닌 0~ 2000001로 범위를 줘서 i-10000000를 출력하는 방식으로 풀었다
      • 카운팅 정렬 특성 중 시간 복잡도가 O(n)으로 빠른 장점이 있지만 단점으로 값의 범위가 클 수록 불필요하게 배열의 크기가 커진다는 단점이 있어서 퀵정렬, 합병정렬, 힙정렬등을 필요에 따라 사용해주어야 한다고 정리해주셨다

최대공약수와 최소공배수

  • 내풀이
    • 먼저 최대 공약수를 구했는데 두 수 중 작은수까지 반복하는 반복문을 만들어 두수를 나눈 나머지가 모두 0인 것들을 계속 저장해서 반복문이 끝나고 저장되어 있는 수를 출력하였다
    • 최소 공배수를 구할 땐 2중배열을 만들어 먼저 큰수에 i를 곱한 값과 작은수의 j를 곱한값이 같을 때까지 곱한후에 같으면 곱한 값을 출력해주었다
      • 만약 큰수에 i를 곱한것보다 작은수에 j가 커진다면 안에 배열을 break하여 연산이 최소가 되도록 하였다
  • 다른사람풀이
    • 참고자료 : https://st-lab.tistory.com/154
    • 최소공배수와 최대공약수를 푸는데 도움이되는 유클리드 호제법에 대해서 배웠다
    • 먼저 두수 a, b와 두수를 나눈 나머지 r이 있을때 a, b의 최대공약수는 b, r의 최대공약수와 같다(a>=b , b> r >=0 )
      • 재귀함수나 반복문을 통해 a , b를 b, r 형태로 나누다보면 결국 r이 0이되는 시점이 있는데 이 때 b의 값이 최대공약수가 된다
        • 정의에 대한 자세한 설명이 있었지만 잘이해하진 못하였고 오늘은 일단 유클리드호제법의 사용법에 대해서 익혀보자
    • 최소 공배수 공식에 따라 a X b X d 이고 A = ab, B = bd 형태로 되어 있기 때문에 AXB를 한뒤 2번 곱해진 d를 한번 나누어줘야 한다
      • 즉 AXB/D를 해주면 최소공배수를 구할 수 있다
    • 알고리즘 시간에도 배웠던 것 같은데 잊고있었던 방식인데 많이 사용되니까 나올 때마다 반복해서 보고 익혀두어야할 알고리즘인 것 같다

소트인사이드

  • 내풀이
    • 0~9까지 담을 수 있는 int 배열을 만든후 입력받은 숫자를 하나씩 뽑아 해당 숫자 index에 해당하는 값을 ++ 해주어 9~0까지 역순으로 해당 인덱스의 값만큼 숫자를 출력해주어서 해결하였다
      • 카운팅 정렬을 활용한 것으로 범위의 숫자가 0~9까지 작아서 쓰기 좋을 것 같아서 사용했다
  • 다른사람 풀이
    • 비슷했지만 Scanner, BufferedReader, InputStream 등 다양하게 입력을 받아 처리할 수 있음을 알 수 있었다

수 정렬하기3

  • 내풀이
    • 숫자의 범위가 10000까지 밖에 안되기 때문에 카운팅 정렬을 쓰기 좋은 조건이라고 생각하고 카운팅 정렬을 이용하여 풀었다
      • 중복된 숫자가 있기 때문에 boolean배열을 만드는것이 아닌 int배열을 만들고 해당 값만큼 반복해서 index를 출력하는 식으로 정렬을 할 수 있었다
    • 비슷한 유형의 문제임으로 다른사람 풀이는 넘어가기로 했다

소수

  • 내풀이
    • m부터 n까지 돌아가는 반복문을 만든 뒤 중복 반복문을 만들어 2부터 i-1까지 돌아가게 하여 i를 j 로 나누어서 0이 되는 것이 하나라도 있으면 소수가 아닌 것으로 판단하고 break를 하고 없다면 i를 sum에 추가하고 조건문으로 min과 i를 비교하여 작은 값을 min에 넣는다
      • 이렇게 풀었는데 계속 틀리게 결과가 나와서 디버깅을 오랫동안 진행하다 결국 못풀고 질문게시판에서 힌트를 얻었다
        • 첫번째는 소수가 없는 경우 -1을 해줘야 했는데 이건 힌트를 보기전에 해결하긴 했다..
        • 먼저 1은 소수가 아니란 소수의 정의를 잘모르고 있어서 1을 계속 소수값에 포함해서 틀렸다
        • M과 N이 같은경우를 의식해서 첫번째 for문에 같으면 n+1까지 돌아가는걸로 해놨는데 완전히 착각한 것이고 i<=n으로도 충분했다..
  • 다른사람풀이
    • 소수의 성질을 이용하여 n을 2부터 n-1까지 모두 탐색하는 것이아닌 2부터 n의 제곱근까지만 탐색해도 소수가 있는지 없는지 탐색할 수 있었다
    • 마지막으로 에라토스테네스의 체를 활용한 방법을 소개했는데 포인트는 소수가 아닌 수를 만나면 그 배수는 모두 소수가 아닌 것으로 체크를 해서 탐색하는 수를 줄여주는 방법이었다.
      • 이것 또한 n만큼이 아닌 n의 제곱근까지만 체크하면된다
      • 다른 방법에 비교대상이 되지 않을 만큼 빠른 방법이기 때문에 꼭익혀야되는 방법일 것 같아서 내일 다시 복습하기로 하였다

내일 할일

  • 에라토스테네스의 체 복습

  • 알고리즘 문제풀이

  • 이력서 업데이트하기

profile
배우는 개발 일기

0개의 댓글