오늘 할일
- 알고리즘 문제풀이
- 포트폴리오 수정
- 프로젝트 준비
- 프로젝트 회의
오늘 한 것 & 배운 내용
알고리즘 문제 풀이
-
문제 해석
- 정수 N을 3으로나누거나 2로나누거나 1을 빼주는 연산을 반복하여 1을 만들 때 최소한의 연산횟수를 구하라
-
풀이 계획
- 최소횟수를 구하기 위해선 3으로 나누는 연산이 많아져야 하니 먼저 3으로 나누어서 나머지가 0이면 나누고 1이면 -1연산 2면 -2를 한번해주어 3으로 나누어떨어지는 것을 반복한다
- N이 3보다 클때까지 위의 연산을 반복하고 나머지 수를 2로 나누는과정을 반복한다
-
나의풀이
- 풀이 계획처럼 쉽게 접근해서 풀어보려고 했지만 3으로 먼저나누는 것보다 -1을 먼저하는게 더 최소값인 경우도 있어서 쉽게 풀이할 수 없었다
- 결국 배열을 이용해 1부터 최소 숫자를 기록하여 먼저 정상 동작으로 count를 구한 뒤에 arr[i/3]+1을 한값과 비교해서 최소값을 counter로 넣어주고 [arri/2]+1한값, arr[i-1]+1한값의 최소값을 모두 구해준뒤 최종 최소값을 arr[i]에 넣어주는 방식으로 최소값 배열을 완성시키고 마지막으로 arr[n]을 출력해주었다
- arr[i/3]+1 은 일반 로직으로 구한 연산횟수보다 배열에서 구해놓은 최소값에 *3을 한번 해주는 연산이 더 최소 연산인지 확인하는 로직이다
- 아직 동적계획법에 익숙하지 않아 푸는데 더어려움을 겪었지만 테스트케이스만 참고하고 풀이해낸것에 만족스럽고 동적계획법 문제 푸는데 도움이 되는 과정이 되었으면 좋겠다
-
다른사람풀이
- n%6 (2와 3모두나눠지는 경우), n%3, n%2 인 경우를 나누어 d[n-1], dp[n/3], dp[n/2] 중 최소값을 골라 거기다 +1해주는 방식으로 깔끔하게 재귀로 풀수 있었다
- 하나의 점화식을 만들어 dp배열을 활용하여 연산횟수를 줄여나가면서 구한다는 것은 변함이없는데 이걸 생각해내기가 아직은 어려운 것 같다
- 참고 : https://st-lab.tistory.com/133
-
느낀점
- 어려웠지만 테스트케이스만 참고하고 어떻게든 풀어내는 것이 많이 남는 것 같다. 하지만 시간이 너무오래걸리기 때문에 만약 이렇게 풀지 못하는 문제는 다음시간에 이어서 푸는 식으로 하여서 전체 공부일정에 너무 영향이 가지 않도록 하는게 더 좋은 방법 같다
새로운 강의 찾기
- 이번 책을 보며 따라하는 예제를 통해 정말 많이 배웠기도 했고 취업을 준비하면서도 꾸준히 성장할 수 있는 기반을 마련하기 위해 하나의 프로젝트를 완성시킬 수 있는 강의를 찾아보았다
- 이론적인 강의도 좋지만 어느정도 배경을 쌓았다면 어떻게든 만들어보는 강의를 통해 자꾸 코딩을 해보면서 배우면 그자체로 프로젝트에 적용할 수 있는 좋은 예가 쌓이기도 하고 따라하면서 디버깅을 해나가면서 기술들이 체화되기 때문에 실력을 쌓기 정말 좋은 방법인 것 같다
- 이전 부터 듣고 싶었던 인프런에 스프링부트와 JPA 활용1 이라는 강의를 선택하게 되었고 활용2편까지 하여 프로젝트를 단단히 완성시켜볼 수 있는 좋은 기회를 찾은 것 같아서 좋았다
스프링부트와 JPA 활용
프로젝트생성
실습과정 문제해결
- 프로젝트를 잘못생성해서 지우고 다시생성하려고 하니 같은 이미 프로젝트가 생성되있다며 생성이 되지 않고 자꾸 디렉토리가 자동으로 생성이되었다...
- 해결책을 찾아보니 프로젝트를 모두닫고 Intellij에 Recent Project에서 해당 프로젝트를 지워줘야 자동으로 재생성되는 것을 방지할 수 있었다
내일 할일