전체 글 178

[Algorithm] 정렬 알고리즘 : 외부 정렬

이전에 버블, 선택, 삽입, 합병 등 여러 정렬알고리즘에 대해서 많은 게시글을 올렸었다. 정렬알고리즘의 종류로는 내부정렬, 외부정렬이 있다. 내부정렬 입력의 크기가 주기억 장치의 공간보다 크지 않는 경우에 수행되는 정렬이다. 버블, 선택, 삽입, 합병, 쉘, 힙, 합병, 퀵정렬 등 외부정렬 입력의 크기가 주기억 장치 공간보다 큰 경우, 보조기억 장치에 데이터를 저장하여 정렬을 하고자 하는 경우에 사용된다. 보조 기억 장치에 있는 입력을 여러 번에 나누어 주기억 장치에 읽어들인 후, 정렬하여 보조 기억 장치에 다시 저장하는 과정을 반복한다. 예를 들면, 주기억 장치의 용량이 1GB이고, 입력 크기가 100GB라면, 어떤 내부 정렬 알고리즘으로도 직접 정렬할 수 없어서 외부 정렬알고리즘을 사용해야한다. 1️..

Algorithm 2021.11.21

[Algorithm] 동전 거스름돈 : 동적 계획 알고리즘

동전 거스름돈 문제는, 그리디 알고리즘에 대한 개념을 소개하는 포스팅에서 간단하게 설명했었다. 대부분의 경우, 그리디 알고리즘으로 해결할 수 있으나 해결 못하는 경우도 있다. 동적 계획 알고리즘은 모든 동전 거스름돈 문제에 대하여 항상 최적해를 갖는다. 💡동적계획 알고리즘으로 접근 1️⃣ 부분 문제 찾기 이전 포스팅인 배낭 문제처럼, 동전 = 물건, 거스름돈 = 배낭의 무게 라고하면 배낭문제와 유사하게 정의된다. 동전을 1원씩 증가시켜 문제를 해결해 보자 -> 이 부분문제들의 해를 1차원 배열 C에 저장하자 1원을 거슬러 받을 때 사용되는 최소의 동전 수 C[1] 2원을 거슬러 받을 때 사용되는 최소의 동전 수 -> C[2] 3원을 거슬러 받을 때 사용되는 최소의 동전 수 -> C[3] ... n원을 거..

Algorithm 2021.11.16

[React] Study # 22 | Immer를 사용한 더 쉬운 불변성 관리

리액트에서는 배열이나 객체를 업데이트 해야할 때, 직접 수정하면 안되고 불변성을 지켜주면서 업데이트를 해주어야한다. 이때, concat, filter, map등의 함수를 사용해야한다. 하지만, 만약 객체의 데이터 구조가 복잡해지면 불변성을 지켜가며 새로운 데이터를 생성해내는 코드가 조금 복잡해지게 된다. 이때, immer라는 라이브러리를 사용하면 우리가 상태를 업데이트 할 때, 불변성을 신경쓰지 않으면서 업데이트를 해주면 Immer가 불변성 관리를 대신 해준다. Immer 사용법 1️⃣ Immer 설치 yarn add immer 2️⃣ immer 불러오기 보통은 produce라는 이름으로 불러온다. import produce from 'immer'; 3️⃣ produce 함수 사용법 첫번째 파라미터 : ..

[React] Study #21 | Context API를 사용한 전역 값 관리

이전 #20 까지 공부했던 챕터에서 까지, 특정 함수를 특정 컴포넌트를 거쳐서 원하는 컴포넌트에게 전달해주었다. 컴포넌트 한개 정도를 거쳐서 전달하는 것은 사실 큰 불편함은 없지만, 만약 3~4개 이상의 컴포넌트를 거쳐서 전달을 해야하는 일이 발생한다면 매우 번거로울 것..! 그럴 땐, 리액트의 Context API와 이전 #20에서 배운 dispatch를 사용하면 복잡한 구조를 해결! 💡 Context API? 프로젝트 안에서 전역적으로 사용할 수 있는 값을 관리할 수 있다. 꼭 상태를 가리키지 않아도 된다. (값!) 이 값은 함수일 수도, 외부 라이브러리 인스턴스 일 수도 있고, 심지어 DOM일 수도 있다. 1️⃣ Context 만들기 const UserDispatch = React.createCon..

[Algorithm] 배낭(Knapsack) 문제 : 동적계획 알고리즘

앞서, 그리디 알고리즘을 통해 해결했던 배낭문제를 동적계획 알고리즘을 이용해서 해결해보자! 💡배낭문제의 부분문제를 찾아내기 4가지 요소 : 물건, 물건의 무게, 물건의 가치, 배낭의 용량 이중에서 물건과 물건의 무게는 부분문제를 정의하는데 고려 이유 : 배낭이 비어있는 상태에서 시작하여 물건을 하나씩 배낭에 담는 것과 안 담는 것을 현재 배낭에 들어있는 물건의 가치의 합에 근거하여 결정해야하기 때문 또한 물건을 배낭에 담으려고 할 경우, 배낭 용량의 초과 여부를 검사해야한다. 따라서, 부분문제를 아래와 같이 정의! K[i,w] = 물건 1~i 까지 (임시) 배낭의 용량이 w일 때의 최대 가치 i= 1~n, w= 1~C n : 물건의 개수, C: 배낭의 용량 여기서 C의 값이 매우 크면, 알고리즘의 수행시..

Algorithm 2021.11.10

[Algorithm] 편집 거리 문제 : 동적계획알고리즘

❓문제 삽입, 삭제, 대체 연산을 사용하여 문자열 S를 문자열 T로 변환 시키는데 필요한 최소의 편집 연산 횟수, 즉 편집거리를 찾아라! 동적계획 알고리즘 Remind - 작은문제에 대한 모든 가능성을 고려해서 다음 크기의 문제에 대한 최적해를 결정 -> 항상 최적해를 구할 수 있음 - 해당 문제에서, 최적성의 원리는 만족됨! 💡생각해야할 것 문자열을 바꾸는데, 어떤 연산을 어느 문자에 수행하는가에 따라 편집 연산 횟수가 달라진다. 💡동적 계획 알고리즘으로 해결하려면 부분 문제들을 어떻게 표현? 만약 접두부에 대한 편집거리를 알고있다면 (최적성의 원리 만족), 각 스트링의 나머지 부분에 대해서 편집거리를 찾음으로써 주어진 입력에 대한 편집거리를 구할 수 있다. 부분 문제 정의 E[i,j] : S의 접두부..

Algorithm 2021.11.10

[React] Redux #3 | 리덕스 모듈 만들기

리액트 프로젝트에 리덕스를 적용하기 위한 리덕스 모듈을 만들어보자! 💡리덕스 모듈? 다음 항목들이 모두 들어있는 자바스크립트 파일 액션 타입 액션 생성함수 리듀서 위 항목들을 리덕스를 사용하기 위해 각각 다른 파일에 저장할 수도 있다. 액션과 리듀서가 서로다른 파일에 정의되어 있을 수도 있지만, 개발하는데 꽤나 불편할 수도 있으므로 리듀서와 액션 관련 코드들을 하나의 파일에 몰아서 작성해보자! (Duck 패턴) 1️⃣ counter 모듈 만들기 첫번째 모듈, counter을 만들어보자! modules/counter.js // 액션 타입 만들기 // Ducks 패턴을 따를 땐, 액션의 이름에 접두사 넣어주기! // 다른 모듈과 액션이름이 중복되는 것을 방지할 수 있음! const SET_DIFF = 'co..

React/Redux 2021.11.05

[React] Redux #3 | 리덕스 사용 준비

리덕스 라이브러리 설치 yarn add redux redux 를 불러와서 redux에 내장된 API를 사용해보고 연습해보자! exercise.js import { createStore } from 'redux'; // createStore 는 스토어를 만들어주는 함수 // 리액트 프로젝트에서는 단 하나의 스토어를 만든다. // 리덕스에서 관리할 상태 정의 const initialState = { counter: 0, text: '', list: [] }; // 액션 타입 정의 // 액션 타입은 주로 대문자! const INCREASE = 'INCREASE'; const DECREASE = 'DECREASE'; const CHANGE_TEXT = 'CHANGE_TEXT'; const ADD_TO_LIST ..

React/Redux 2021.11.05

[React] Redux #2 | 리덕스의 3가지 규칙

1️⃣ 하나의 애플리케이션 안에는 하나의 스토어 키워드 포스팅에서 작성했듯 하나의 애플리케이션 안에는 하나의 스토어가 있어야한다. 여러개가 가능하지만, 권장 X 특정 업데이트가 너무 빈번, 애플리케이션의 특정 부분을 완전히 분리시킬 때 여러개! 개발도구를 사용하지 못하게 됨.. 2️⃣ 상태는 읽기 전용 (불변성 유지) 기존의 상태는 건들이지 않고 새로운 상태를 생성하여 업데이트 해주는 방식! 개발자 도구를 통해서 뒤로 돌리고 혹은 다시 앞으로 돌릴 수 있다. shallow equality 검사 : 내부적으로 데이터가 변경되는 것을 감지하는 검사 방식 곧, immutable.js 혹은 immer.js를 사용하여 불변성을 유지하며 상태를 관리하는 방법에 대해 배우게 될 것! 3️⃣ 변화를 일으키는 함수, 리..

React/Redux 2021.11.05

[React] Redux #1 | 주요 키워드

Redux의 주요키워드는 대부분 useReducer을 사용할 때 접해본 개념들이다! 1️⃣ 액션 (Action) 상태에 어떤 변화가 필요할 때, 액션을 발생! 하나의 객체로 표현 { type: 'TOGGLE_VALUE" }​ type 필드가 필수적, 그 외의 값들은 개발자 마음! 2️⃣ 액션 생성 함수 (Action Creator) 액션을 만드는 함수 단순히 파라미터를 받아와서 액션 객체 형태로 만듦. export function addTodo(data){// data를 파라미터로 받아옴. return {// 액션 객체 형태로 만듦 type: 'ADD_TODO', data }; } //화살표 함수로도 만듦! (파라미터로 받아오는 대신!) export const changeInput = text => ({..

React/Redux 2021.11.05