분류 전체보기
-
[JS] 백준 1003번 피보나치 함수 문제Algorithms 2022. 12. 21. 20:31
DP(다이나믹 프로그래밍) 알고리즘의 기초 문제이다. 동적계획법이라고도 불리는 DP알고리즘은 큰 문제를 잘게 나누었을 때 하위구조에서 동일한 문제가 반복되는 경우 작은 문제의 답을 저장하여 큰 문제를 해결하는 알고리즘이다. 기초라고 하는데 나는 잘 이해가 되지 않아 많이도 해맸다. 몇가지 개념들을 학습하고 시간을 엄청 쏟은 뒤에야 이해하고 문제를 풀 수 있었다. 우선 이 문제를 이해하려면 다음 3가지 개념을 알아야 한다. 1. 피보나치 수열의 원리 2. 재귀함수의 원리 3. DP알고리즘에서 메모이제이션 위 세가지 개념을 먼저 이해했다면 이제 피보나치 수열을 재귀로 똑같이 진행하는데 메모이제이션 기법을 활용해 나가면 된다. 문제에서는 0과 1이 호출되는 횟수를 리턴하라고 되어있으므로 fib(n-1) + f..
-
선택정렬(Select Sort)Algorithms 2022. 12. 20. 06:31
선택정렬은 다음과 같은 논리를 가진다. 버블정렬과 비슷하지만 큰 값을 배열 끝에 위치시키는 대신, 작은 값을 루프를 돌때마다 한 번에 하나씩 앞쪽부터 차례대로 정렬시킨다. 그러니까 정렬된 데이터가 점점 누적되는 논리를 가진다. 먼저 첫번째 숫자를 min(가장 작은숫자)로 선택하고 차례대로 비교한다. 두번째 숫자인 44는 19보다 크기 때문에 지나친다. 38도 19보다 크기 때문에 지나친다. 그러다가 5를 만나면 5가 19보다 작기때문에 새로운 min이 된다. 이후 마지마까지 비교하게 되고 가장 작은 숫자인 5를 찾게된다. 그러면 이제 현재 i인 19와 min인 5의 자리를 교환한다. 그다음은 44부터 시작하게 되고 (5는 정렬된 상태) 이 과정을 반복하게 되면 오름차순 정렬이 완성된다. 구현한 코드는 다..
-
버블정렬(BubbleSort)Algorithms 2022. 12. 20. 05:49
sort(정렬)알고리즘들 중에서 버블정렬 알고리즘은 효율적이지 않다. 흔히 사용되지도 않는다. 실제로 버블정렬을 구현할 일이 거의 없기 때문에 배우는 사람도 많지 않다고 한다. 하지만 다른 정렬 알고리즘이 왜 버블정렬 알고리즘보다 더 좋은지 이유에 대해 이해할 수 있다. 그리고 버블정렬은 매우 재밌는 문제이고, 이를 어떻게 사용하는지 알면 재밌는 알고리즘이다. 버블 정렬의 개념: 배열을 오름차순으로 정렬해야 할 경우 더 큰숫자가 한번에 하나씩 뒤로 이동한다. 루프를 돌면서 각 항목을 다음항목과 비교하는 것이다. 그리고 이 숫자가 비교대상보다 더 큰지 확인하고, 더 크면 순서를 교환한다.(swap) 29는 10보다 크기 때문에 29는 10과 자리를 바꿔 뒤로 가게된다. 이렇게 첫번째로 배열 끝까지 버블 정..
-
Naive search 알고리즘Algorithms 2022. 12. 20. 04:31
str1(long)과 str2(short)가 주어졌을때 str2가 str1에 들어있으면 1을 리턴 없으면 0을 리턴 str1을 for loop으로 돈다. 그안에 2중포loop으로 str2를 돈다. 먼저 str2[j]하고 str1[i]하고 다르면 break해준다. (첫문자부터 틀리면 str2는 돌릴필요가 없기때문에) 핵심 = str2[j]와 str1[j+i]가 같으면 count ++ 해준다 (이중포문에서 j하고 i를 동시에 비교하고싶을때 사용) j만 증가하지만 i에다가 j를 더해주면 동일한 idx를 비교가 가능하다. const naiveSearch = (long, short) => { let count = 0; for (let i = 0; i < long.length; i++) { for (let j = ..
-
알고리즘, 테스트코드가 필요한 이유생각 정리 2022. 12. 15. 20:04
지금까지 여정. 어느덧 개발자가 되겠다고 결심하고 공부를 시작한지 약 9개월정도가 흘렀다. 그동안 많은 성장이 있었고, 이제 어느정도 프로그램이 동작하게끔 만드는 정도의 실력은 갖추었다고 생각이 든다. 하지만 내가 작성했던 코드들을 보다보면 정말 th레기 그 자체라는 생각이 들 때가 많았다. (내가 왜그랬지..좌절의 연속.) 그중 가장 th레기 코드가 많은 프로젝트는 짧은 기간안에 어떻게든 완성을 시켜야 했다. 그래서 "어떻게든 굴러가게 만들자" 라는 마음가짐으로 코드를 썻고, 결과적으로 가독성은 물론이고 효율성도 저세상 가버린 코드들로 가득차게 되었다. 천천히 고민할 여유가 없었던 탓도 있지..
-
[ JS ] 자바스크립트로만 개발하기JavaScript 2022. 11. 16. 00:16
튜닝의 끝은 순정이다. 요즘에는 오직 자바스크립트로만 쇼핑몰을 만들어 보고있다. 최신 유행하는 여러가지 라이브러리와 프레임워크가 많지만 그것들도 언젠가는 사라질 것이다. 최신 유행하는 기술들을 따라가다보니 이것저것 익히고 아는것도 많아진것 같지만 사실 실력은 제자리걸음인 것 같다는 생각이 들었다. 그래서 자바스크립트를 깊게 이해하고 실력을 키우는 편이 좋겠다고 생각했다. 리액트, nextJS 등 최신 프레임워크 라이브러리로만 사용해서 개발하다가 자바스크립트로만 만들려고 하니 여러가지로 불편하고 부딪히는 부분이 많았다. 하지만 유튜브, 기타 강의와 책을 보면서 하나하나씩 해결해 나가다보니 정말 많은것들을 배우고 성장할 수 있었다. 특히 가장 크게 배운것은 전체적인 프론트엔드 개발시장의 패러다임이 어떻게 흘..
-
SWR로 데이터 가져오기NextJS 2022. 11. 14. 19:05
SWR을 왜 사용해야하는가? 프론트엔드에서 골칫거리중 하나는 바로 상태관리다. 보통 첫 생명주기를 갖는 제일 상위 컴포넌트에서 데이터를 useEffect로 가져와서 하위 컴포넌트들에게 props로 뿌려주는 방식으로 사용하였다. 하지만 프로젝트가 커지면서 Prop Drilling으로 인해 redux같은 전역상태관리 툴이 유행하였고, 그게 지금까지 프론트엔드에서 일반적인 상태관리 시스템이였다. 하지만 이 방식 또한 단점이 있는데 우선 데이터를 관리하기 위해 필요한 코드의 양이 많아진다.( 스토어 만들고, 데이터를 가져오고, 스토어에 넣는 액션을 하나하나 지정 등등..) 또한 동적인 요소가 많아지다보면 이것저것 신경써야 할 것이 한두가지가 아니였다. 그러던 중 next js 공식문서를 보다가 SWR을 알게되었..
-
setState() 비동기 문제해결React 2022. 11. 6. 04:38
리액트에서는 useState hook을 사용하여 간편하게 상태관리를 할 수 있다. 하지만 상태를 변경하는 setState() 함수를 사용하다보면 직면하는 문제가 있는데, setState() 함수가 내가 원하는대로 동작하지 않는다는 것이였다. 상황) 사용자가 TodoList Item의 checkBox를 클릭하면, 서버에 TodoItem을 수정하는 PutTodo요청을 보내야 한다. 사용자가 checkbox Input을 클릭하면 setChecked로 상태를 변경하고, putTodo에 변경된 checked 상태를 담아서 요청을 보냈다. 예상한 흐름 = 클릭 -> 상태변경 -> 서버요청 그런데 이상하게 새로고침하면 상태가 이전으로 돌아가 있었다. 무슨일인가 싶어서 네트워크 탭을 보니 putTodo요청에는 setS..