20210405-TIL

나영원·2021년 4월 5일
0

T.I.L.

목록 보기
135/145

오늘 할일

  • 알고리즘 문제풀이
  • 포트폴리오 수정하기
  • 채용공고 읽기

오늘 한 것 & 배운 내용

알고리즘 문제 풀이

방번호

  • 문제 해석
    • 방번호가 주어지면 0~9 번 숫자세트 몇개로 해당 방번호를 구할 수 있는지 구하는 문제이다
      • 이때 6과 9는 뒤집어서 사용될 수 있다
  • 풀이 계획
    • 크키가 10인 int 배열을 만든다
    • 호수로 입력된 값을 하나씩 분리해서 검사하여 int배열에 index에 넣어 ++한다
    • 배열을 돌면서 최대값을 구한다
      • 6과 9는 합쳐서 /2를 해주어서 검사하다
    • 최대값을 출력한다
  • 나의풀이
    • 풀이 계획처럼 풀어가니 크게 어렵지 않게 풀수 있었다
    • 다만 입력이 0인 경우 답이 1이나와야 되는데 0이 나와서 답안을 여러번 틀렸다
      • 디버깅 하면서 0인 경우에도 체크했는데 결과가 0이나왔는데 이상한점을 못느끼고 넘어가서 더 반성이 되었다

날짜 계산

  • 문제 해석

    • 1년이면 1 1 1, 2년이면 2 2 2 이런식으로 1년에 모든 숫자가 1씩 증가하는 달력이 있다
    • 앞에수부터 E, S, M이라 할때 1<=E <15, 1<=S<=28, 1<=M<=19) 이고 각 숫자를 넘어가면 다시 1돌아간다
    • 숫자 3개를 주었을 때 몇년도인지 구하는 프로그램을 작성
  • 풀이 계획

    • E, S M 을 입력받는다
    • 반복문을 만들어 3개의 숫자에 1씩을 더하도록 한다
    • 더한 값이 각숫자의 범위에 맞는지 확인하고 범위를 초과했으면 다시 1로 바꾸어준다
    • 검사한 숫자와 입력받은 값이 모두 일치하면 반복문이 반복된 횟수를 출력한다
  • 나의풀이

    • 풀이 계획 그대로 풀어나갔고 어렵지 않게 풀수 있었다
  • 다른사람풀이

    • 참고 : https://geehye.github.io/baekjoon-1476/#
    • 풀이
      • year을 1씩 더 해준다
      • year에서 각각 e s m 을 빼주고 각자의 최대값으로 나누어서 모두 0이 나올대까지 반복한다
      • year를 출력한다
    • 배운점
      • 각각 을 하나의 수로 다루는 것보다 하나의 year로 다룰 수 있는 접근방법이 더 좋은 접근이었던것 같다
      • 각각의 값은 각각의 최대값을 나눈 나머지와 같으니 year에서 빼주고 나누어 떨어지는지 확인하는 접근방식은 나머지를 이용한 좋은 방법인 것 같다
        • 이런식으로 통합 풀이해 나갈 수 있으면 가독성과 성능 모두 잡을 수 있는 구현이 되는 것 같다

약수

  • 문제 해석

    • 1과 N을 제외한 N의 약수들이 제공될 때 N을 구하는 문제
      • N의 약수의 개수와 N의 약수들이 주어진다
      • 2<= N의 약수 <=100000
      • 출력은 32비트 부호있는 정수로 해야한다(long타입)
  • 풀이 계획

    • 약수는 N의 제곱근을 기준으로 대칭이 되도록 배치가 되어있다

      • ex) 100의 약수는 2 4 5 10 20 25 50 이고 10을 기준으로 양쪽수를 하나씩 뽑아서 곱하면 모두 100이된다
    • 이 성질을 이용해서 가장 큰 약수와 가장 작은 약수를 곱하면 N을 구할 수 있을 것 같다

      • 만약 약수의 개수가 1이라면 입력받은 약수를 제곱을 하면 될 것 같다
    • 약수의 개수 크기만 큼 배열을 만들어서 index 0과 index[length-1]을 곱해주기로 하였다

    • 출력은 long타입으로 해주어야 한다

  • 나의풀이

    • 배열을 만들어서 모든 약수의 값을 입력받아 맨처음 값과 가장 마지막 값을 곱해서 출력하였다
      • 이렇게 했더니 테스트케이스는 통과하는데 제출하니 답이 틀리는경우가 생겨 디버깅을 하였다
    • 주어지는 약수의 값이 내림차순으로 제공되는 줄 알았는데 실제로는 순서에 상관없이 제공되어 첫값과 끝값이 최소값과 최대값임을 보장할 수 없었다
      • 배열을 오름차순으로 정렬하여 똑같이 맨처음값과 맨마지막 값을 곱해서 출력하였더니 정답이되었다
    • 정렬까지 해주어야 되는 문제면 차라리 배열을 만들지말고 최소값과 최대값을 구하자고 생각하여 2개의 변수를 선언하여 값을 넣고 곱해주어 출력하였다
      • 결과를 보니 성능측면에서는 별차이가 없었다..

막대기

  • 문제 해석

    • 64cm 막대기를 반으로 나누어가면서 주어진 입력값에 맞는 막대기를 만들기 위해서 몇개의 막대기를 이어 붙여야되는지 구하는 문제이다
      • 반으로 나누는 막대기는 현재 막대기들 중 가장 막대기를 짧은 것을 절반으로 자른다
      • 만약 짧은 막대기를 반으로 자른것 중 하나를 버리고 남아있는 막대의 길의의 합이 X보다 크다면 자른 막대의 절반 중 하나를 버린다
      • 위의 과정을 반복한다
    • 몇번 자르는지 묻는 문제가 아닌 이어 붙인 막대기가 몇개인지를 찾는 문제이다
  • 풀이 계획

    • 먼저 막대길이와 X를 비교하여 작다면 막대를 반으로 자른다
    • 반으로 자른 값과 X를 비교한다
      • 반으로 자른값이 X보다 크다면 반으로 자른값이 전체 막대의 길이가 된다
      • 반으로 자른값이 x보다 작다면 전체 막대의 길이는 유지하고 짧은 막대의 길이가 반으로 자른 값이 된다
        • 이때 막대가 하나 늘어나게 되니 +1을 해준다(막대의 수는 기본값이 1이 된다)
    • 위를 반복하여 반으로 자른값이 x와 같을때까지 반복한다
  • 나의풀이

    • X를 입력받고 가장 짧은 막대를 나타내는 bar, 합친막대의 길이를 나태는 sum, 막대의 길이를 나타내는 sum 변수를 선언한다

      • bar =64 sum = 64 num =1 로 초기화한다
    • while문을 만들고 bar를 2로 나누어 -=해주고 sum에 bar를 -=을 해준다

    • 변화된 sum과 X를 비교한다

      • X와 같다면 그대로 while문을 빠져나간다
      • X보다 sum이 작다면 막대를 버리면 안되니 sum에 다시 자른 값을 += 해주고 막대가 늘어났으니 num++ 해준다
      • X보다 sum이 크다면 막대를 버려야 하니 sum을 그대로 유지해준다
    • 반복문에서 빠져나올 때가지 반복하다가 num을 출력한다

    • 예외 값으로 만약 X가 64라면 반복문을 거치지 않고 바로 1을 출력하도록 한다

스코페 문제 해설

  • 지난번에 참석햇던 스코페 문제에 대한 해설이 메일로와서 간단히 체크해보았다
    • 6문제 중 2문제가 동적프로그래밍 활용법을 알고 있는지 문제였고 점화식을 만들 수 있는지 없는지로 판단이되는 문제같다
      • 작은 문제 단위로 나누어서 해결한다는 정의가 이제보니 점화식을 만드는 과정이었던 것 같다
    • 시간의 중복범위를 묻는 문제는 시간단위를 hh x 60으로 만들어 starttime과 endtime을 직접비교할 수 있게 만들어서 풀었어야되는 문제였다
    • 하나는 정렬 문제였는데 전체의 데이터를 하나의 배열이 아닌 2개의 배열로 만들어서 정렬하는게 포인트였던 것 같다
  • 시험볼때는 정말 어려웠지만 해답을 보니 1차문제라 어느정도는 도전해볼만한 문제였던 것 같다
    • 언능 정진해서 쭉쭉 풀어갈수 있으면 좋겠다

사담

  • 오늘 처음으로 문제 해석과 풀이 계획에 대해서 작성하면서 알고리즘 문제에 접근했는데 기존에 하던 방식보다 구체적으로 문제를 분석해놓은 상태에서 풀이에 들어가니 구현해야할 점들이 명확해서 도움이 많이 되었다
    • 문제해석 - 풀이 계획 - 풀이 - 피드백 순으로 이어지는 사이클을 잘만든 것 같고 꾸준히 유지하여 코딩테스트때도 활용가능하도록 하면 좋을 것 같다

포트폴리오 수정

  • 앞으로 어느정도 완성이 될때까지 포트폴리오는 계속 읽고 수정하고를 반복해야 될 것 같다
    • 다른사람들은 어떻게 했나 래퍼런스들을 찾아보면서 꾸준히 수정해 간다면 더 좋은 포트폴리오가 될 것 같다
  • VSCode 이용해서 포트폴리오를 수정해 나가고 있는데 인텔리제이만 좋은줄 알았더니 vscode도 굉장히 좋은 에디터인것 같다
    • 터미널 2개가 동시에 켜지는게 제일 맘에 들었는데 한쪽은 jekyll 서버를 켜두고 한쪽에는 커밋을 하는 용도로 사용할 수 있어서 만족도가 굉장히 높다
    • 개인적으로 하는 포트폴리오 준비이지만 커밋을 열심히 해가면서 하고 있는데 일단 커밋을 해야 개발하는 듯한 맛이 나고 복원해야할
      • 무얼하던 이게 개발자의 기본자세가 아닌가 싶다
    • 비단 에디터 뿐만아니라 언어나 기술에서도 무조건 내가 쓰는게 좋은거야 보다는 다른 것도 열린마음으로 사용하다 보면 좋은 것들을 더 많이 발견할 수 있을 것 같다

내일 할일

  • 알고리즘 문제풀이

  • 포트폴리오 수정

  • 프로젝트 준비

  • 채용공고 읽기

profile
배우는 개발 일기

0개의 댓글