본문 바로가기

분류 전체보기50

BFS (Breadth-First Search) DFS가 궁금하면 아래 글을 참조 DFS (Depth-First Search) ✔ BFS(Breadth-First Search) BFS는 너비 우선 탐색이라고도 부르며, 그래프를 탐색하는 방법 중 하나이다. 하나의 정점으로부터 시작해서 차례대로 모든 정점들을 한 번씩 방문하는 것으로 즉, 시작 노드에서 출발해 인접한 노드(가까운 노드)를 먼저 탐색하고 현재 깊이의 모든 노드를 탐색하면서 가는 알고리즘이다. 깊게 탐색하기 전에 넓게 탐색 두 정점 사이의 최단 경로를 구할 때 사용 같은 가중치를 가진 그래프에서 사용 큐(queue)를 사용하여 구현 ※ 중요한 점은 방문한 정점은 다시 방문하지 않아야 한다. 만약 가중치가 다른 그래프일 때 최단거리를 구하는 알고리즘은 다익스트라, 벨만포드 등으로 구현해야 한다.. 2023. 6. 17.
[NestJS] Configuration 설정 & TypeORM 연결 ✔ 필요한 종속성 설치 Configuration과 TypeORM을 사용하기 위해서 Dependency를 설치해야 한다. $ npm i --save @nestjs/config $ npm i --save @nestjs/typeorm typeorm mysql2 @nestjs/config 패키지는 내부적으로 dotenv를 사용한다. @nestjs/config 패키지를 사용하기 위해선 TypeScript 4.1 이상이 필요하다. ✔ TypeORM 연결 NestJS에서 TypeORM을 연결하는 방법은 여러 방법이 존재한다. AppModule의 TypeOrmModule.forRoot에 직접 주입 json 파일 설정 ts 파일 객체에 설정 후 Root 인수에 객체 주입 ConfigService 사용 1. 직접 주입 A.. 2023. 5. 31.
MySQL 유저 계정 생성 ✔ MySQL 유저 계정 생성 mysql 접속 $ mysql -u root -p Enter password: 패스워드 입력 계정 생성 CREATE USER '생성할 계정명'@'localhost' IDENTIFIED BY '패스워드'; Query OK, 0 rows affected 나오면 성공 mysql을 docker image로 받아서 사용하는 경우(ip부분에 172.17.0.1) 172.17.0.1은 저의 ip이기 때문에 자기 자신의 ip를 적으면 됩니다. ifconfig (윈도우일 경우 ipconfig)으로 docker ip 확인 CREATE USER '생성할 계정명'@'172.17.0.1' IDENTIFIED BY '패스워드'; Query OK, 0 rows affected 나오면 성공 생성한 계정.. 2023. 5. 5.
큐(Queue) ✔ 큐(Queue) 큐도 스택과 마찬가지로 알고리즘보단 자료 구조에 해당하고 컴퓨터에서 많이 사용되는 자료 구조이다. 큐는 먼저 집어넣은 데이터가 먼저 나오는 선입선출(FIFO: First In First Out) 구조로 저장하는 형식을 말한다. 즉, 가장 처음에 넣은 값이 먼저 나오는 것을 FIFO 구조라고 한다. 나중에 넣은 값이 먼저 나오는 스택과는 반대되는 개념이다. 쉬운 예시로 파이프 혹은 드라이브 스루를 생각하면 된다. 드라이브 스루는 가장 먼저 들어가는 사람이 먼저 주문을 하게 되고 그 뒤로 차례로 줄을 서게 된다. 먼저 들어간 사람이 주문을 끝내고 가지 않는 이상 그 뒤로는 계속 기다려야 하는 구조이다. 이 구조가 큐 자료 구조에 해당한다. ✔ 큐의 연산 큐는 양쪽이 뚫려 있는 구조로 한쪽.. 2023. 5. 2.
스택(Stack) ✔ 스택(Stack) 스택은 알고리즘보단 자료 구조에 해당하고 컴퓨터에서 아주 많이 사용되는 자료 구조이다. 스택은 제한적으로 접근할 수 있는 나열 구조로 한쪽 끝에서만 자료를 넣고 뺄 수 있는 후입선출(LIFO : Last-In First-Out) 구조이다. 즉, 가장 나중에 넣은 값이 먼저 나오는 것을 LIFO 구조라고 한다. 쉬운 예시로 프링글스 과자를 생각하면 된다. 프링글스 과자를 포장할 때 처음 과자가 통 맨 밑으로 들어가게 되고 그다음부터 위로 쌓이게 되고 구매자는 과자를 먹을 때 통 맨 위에서부터 하나씩 꺼내서 먹게 된다. 이 구조가 스택 자료 구조에 해당한다. ✔ 스택의 연산 스택은 가장 윗부분을 "top"이라 명칭 한다. top(): 스택의 가장 윗 데이터를 반환 pop(): 스택의 가.. 2023. 4. 15.
[Github] 깃허브 계정 여러개 연결하기 해당 글은 우분투에서 진행한 내용입니다. ✔ SSH-Key 생성 SSH-Key를 관리하는 디렉터리로 이동 후 생성해 줍니다. 홈 디렉터리 ".ssh" 디렉터리로 이동합니다. ssh 앞에 "."은 숨겨진 파일, 디렉터리에 해당합니다. 만약 디렉터리가 없을 시 생성하고 이동합니다.우분투, 맥의 경우 홈 디렉터리이고 윈도우의 경우 "C:\Users\\user\.ssh" 입니다. $ cd ~/.ssh $ ssh-keygen -t rsa -C '깃허브이메일계정' # 위에 Enter를 하고 나면 아래의 내용이 나온다 # 그러면 만들 rsa 이름 입력. 보통 id_이름_rsa Generating public/private rsa key pair. Enter file in which to save the key (/해.. 2023. 4. 2.
합병 정렬 알고리즘(Merge Sort) ✔ 합병 정렬(Merge Sort) 합병 정렬은 퀵 정렬과 마찬가지로 분할 정복(divide and conquer) 방법을 통해 정렬하는 알고리즘이다. 정렬되지 않은 리스트를 각각 하나의 원소만 포함하는 n개의 부분리스트로 분할한다. (한 원소만 든 리스트는 정렬된 것) 분할한 부분리스트를 반복해서 비교하며 병합하여 정렬된 리스트로 만든다. 합병 정렬은 분할, 정복, 결합, 복사의 순으로 이루어진다. 분할(divide) : 정렬되지 않은 리스트를 절반으로 잘라 비슷한 크기의 두 부분 리스트로 나눈다. 리스트의 길이가 1 이하일 때까지 반복한다. 정복(conquer) : 각 부분 리스트를 재귀적으로 합병 정렬을 이용해 정렬한다. 결합(combine) : 두 부분 리스트를 다시 하나의 정렬된 리스트로 합병한.. 2023. 1. 10.
퀵 정렬 알고리즘(Quick Sort) ✔ 퀵 정렬(Quick Sort) 퀵 정렬은 분할 정복(divide and conquer) 방법을 통해 정렬하는 알고리즘이다. 간단히 얘기하면, 하나의 원소를 기준으로 기준 앞은 작은 모든 원소들이 오고, 뒤에는 큰 모든 원소들이 오도록 리스트를 둘로 분할하여 정렬하는 방법이다. 정렬하려는 리스트 가운데서 하나의 원소를 고른다. 고른 원소를 Pivot(피벗)이라 부른다. 피벗 기준 앞에서 큰 값을 찾고, 기준 뒤에는 작은 값을 찾아 교환하면서 피벗 앞에는 작은 원소들이 오게 하고 뒤에는 큰 원소들이 오도록 정렬을 진행한다. 분할 정복(divide and conquer) 그대로 해결할 수 없는 문제를 작은 문제로 분할하여 문제를 해결하는 방법 ✔ 퀵 정렬 동작 과정 왼쪽 → 오른쪽 순으로 봐주시기 바랍니다.. 2022. 12. 14.
삽입 정렬 알고리즘(Insertion Sort) ✔ 삽입 정렬(Insertion Sort) 삽입 정렬은 적절한 위치에 삽입하여 정렬하는 알고리즘입니다. 삽입 정렬은 리스트의 두 번째 인덱스부터 시작해서 자기 기준의 왼쪽으로 비교하면서 정렬합니다. 또한, 자기 기준 왼쪽 부분은 정렬된 상태라 가정이 되기 때문에 적절한 위치를 파악할 수 있습니다. 예를 들면 [1, 2, 5, 4]인 리스트가 있을 때 현재 세 번째까지 정렬이 완료된 상태고 오름차순이라 가정하겠습니다. 네 번째와 자기 기준 왼쪽 값을 비교해서 자리를 변경하고, 다시 두 번째와 비교를 하지만 두 번째가 더 작기 때문에 변경이 발생하지 않습니다. 그리고 첫 번째는 이미 정렬된 상태여서 더 작은 값이기 때문에 아무 일도 일어나지 않습니다. 그래서 선택, 버블, 삽입 정렬 중에는 가장 적은 연산 .. 2022. 11. 30.
버블 정렬 알고리즘(Bubble Sort) ✔ 버블 정렬(Bubble Sort) 버블 정렬은 구현이 간단하지만 가장 비효율적인 알고리즘입니다. 버블 정렬은 바로 옆에 있는 두 원소를 비교하면서 정렬하는 알고리즘입니다. 오름차순일 경우, 두 원소를 비교해서 작은 값을 앞으로 보내고 큰 값을 뒤로 보내 가장 큰 값이 맨 뒤로 가면서 뒤에서부터 정렬이 완료되는 방법입니다. 내림차순일 경우, 두 원소를 비교해서 큰 값을 앞으로 보내고 작은 값을 뒤로 보내 정렬이 됩니다. ✔ 버블 정렬 동작 과정 왼쪽 → 오른쪽 순으로 봐주시기 바랍니다. 리스트의 첫 번째 인덱스를 교환(Swap) 대상으로 선정하고, 가장 가까운 두 번째 인덱스를 비교해서 교환 대상의 값이 더 크면 위치를 교환하고, 더 크지 않으면 넘어갑니다 리스트의 두 번째 인덱스를 교환(Swap) 대.. 2022. 11. 21.
선택 정렬 알고리즘(Selection Sort) ✔ 선택 정렬(Selection Sort) 선택 정렬은 가장 원시적이고 기초적인 방법 중 하나입니다. 선택 정렬은 이름 그대로 선택한 값을 제일 앞으로 보내서 정렬하는 알고리즘이다. 선택한 값이란 오름 차순일 경우 최솟값을 얘기하고, 내림 차순일 경우 최댓값을 얘기한다. ✔ 선택 정렬 동작 과정 리스트의 첫 번째 인덱스를 교환(Swap) 대상으로 선정하고, 교환 대상과 교환 대상 이후의 리스트를 전체 비교하면서 최솟값을 찾은 후 교환 대상과 최솟값의 위치를 교환(Swap) 첫 번째 인덱스는 정렬된 상태이기 때문에 고정. 두 번째 인덱스를 교환(Swap) 대상으로 선정하고, 첫 번째 인덱스를 제외한 전체 리스트를 비교하면서 최솟값을 찾은 후 교환 대상과 최솟값의 위치를 교환(Swap) 정렬이 완료될 때까지.. 2022. 11. 9.
BigDecimal Type 사용하는 이유 TypeScript에서는 BigDecimal 타입은 따로 존재하지 않습니다. BigDecimal 타입을 사용하는 이유에 대해서 포스트를 작성하게 된 계기는 Java 언어에서 화폐 단위, 비율 계산 등으로 인해 BigDecimal 타입을 사용하는 것을 보고 BigDecimal 타입이 무엇인지? 왜 사용하는지 궁금해서 포스트를 작성하게 됐습니다. Java 언어에서는 숫자를 정밀하게 저장하고 표현할 수 있는 타입으로 BigDecimal 타입을 사용합니다. 소수점을 표현하기 위해 float, double 타입을 사용하는데 float, double 타입으로 사용하지 않고 BigDecimal 타입을 사용하는 이유는 화폐에서 환율 그리고 비율(금액, 퍼센트 할인) 계산 등 소수점까지 정확히 표현해야 하기 때문인데, .. 2022. 10. 26.