암호화가 필요한 이유? 만약 암호화를 하지 않고 사용자의 입력을 그대로(이를 평문이라고 한다) 저장하게 되면, 데이터베이스가 유출되었을 때 사용자의 비밀번호가 제3자에게 노출되게 되며, 이는 심각한 피해를 가져올 수 있다. 따라서 이러한 피해를 방지하기 위하여, 사용자의 비밀번호는 암호화를 거쳐 저장되어야 한다. 이번 포스팅에서는 그 중에서도 강력한 해시 알고리즘으로 유명한 bcrypt 를 이용해본다. 암호화된 패스워드의 생성 우선 bcrypt 모듈을 설치한다. npm i bcrypt 프로젝트에 적용하기 위해, 암호화된 비밀번호를 생성하는 간단한 함수를 구현해보았다. import { genSalt, hash } from 'bcrypt'; const saltRound = 10; const createHas..
다이나믹 프로그래밍 (동적 계획법) 최적해를 구하기 위해 매우 많은 시공간이 필요한 경우 연산 결과를 저장하여 중복 연산을 방지함으로써 시공간 효율성을 높임 간단히 말하자면 한 문제를 무조건 한 번만 풀도록 결과를 저장해 사용한다는 것 언제 사용하는가 큰 문제를 작은 문제(큰 문제의 분할)로 나눌 수 있는 경우 작은 문제와 큰 문제의 해결 로직이 같아야 함 작은 문제에서 구한 정답은 그것을 포함하는 큰 문제에서도 동일 해결 로직이 순수함수(동일 입력에 반드시 동일 출력이 보장)에 해당해야 함 어떻게 저장하는가 위 조건을 만족하는 문제들의 연산 결과들은 수열에 해당한다고 볼 수 있다. 수열은 규칙적으로 배열된 숫자들의 모임이기 때문에 배열(리스트)에 저장한다. 분할 정복 알고리즘과의 차이 분할 정복 알고리..
순차 탐색 앞에서부터 하나씩 차례대로 탐색하는 방법 array = [3, 1, 7, 5, 9] for i in range(len(array)): if array[i] == 7: print(i) break 리스트를 차례대로 순회하므로 시간 복잡도는 O(N)이다. 이진 탐색 정렬된 리스트에 대하여 찾으려는 데이터와 중간 지점의 데이터를 비교해나가며 탐색하는 방법 순차 탐색과 달리 정렬이 되어 있어야 사용할 수 있다. 중간이 정확히 안 나누어질 때는 소수점 이하를 버린다. 시간 복잡도는 O(logN)이다. 구현 def binary_search(array, target, start, end): while start array[middle]: start = middle + 1 elif target < array[..
상당히 늦은 수료 후기이지만... 그동안 배운 내용들을 정리하고 다시 되짚어보고 하느라 바빴당 😅 부캠과의 첫 만남 딱 부캠을 시작할 무렵 썼던 글을 찾았다. 이 전에는 정말 나 뭐 해 먹고 살지?라는 고민으로 매일매일 굴러다니며 살았던 것 같다. 막연히 코딩 너무 재밌는데? 하면서 컴퓨터공학과에 왔더니 몇 년을 다니고서도 막연히 이야! 코딩 너무 재밌다! 라고만 하고 있었기 때문이다. 챌린지 (7~8월) 선발 과정 챌린지 과정은 서류 전형, 1차 코딩 테스트, 2차 코딩 테스트를 거쳐 선발된다. 부스트캠프 5기는 코로나에 의해 부캠 최초로! 모든 과정이 온라인으로 진행되었기 때문에, 1차와 2차 코딩 테스트 역시 모두 온라인으로 치뤄졌다. 난이도는 어렵지는 않다. 정말 얘가 기본만큼은 확실하게 아는가?..
파이썬에서 정수 0, boolean인 False, null로 사용되는 None의 성질이 궁금해져서 테스트해보았다. zero = 0 false = False none = None print(zero == false) # True print(false == none) # False print(zero == none) # False 결론적으로 0과 False는 같은 값으로 취급되나 None과는 모두 다른 값으로 취급된다. zero = 0 false = False none = None # print nothing if zero: print('zero') if false: print('false') if none: print('none') 또한 조건문에서는 위의 세 가지..
정렬 알고리즘(Sorting Algorithm) 데이터를 일정한 순서대로 열거하는 알고리즘 어떤 정렬을 쓰냐에 따라 프로그램의 효율성이 좌지우지될 수 있다. 선택 정렬, 삽입 정렬, 퀵 정렬, 계수 정렬, 병합 정렬, 힙 정렬 정도까지는 알고 있으면 좋다. 선택 정렬(Selection Sort) 순회하며 제일 작은 데이터를 맨 앞으로 옮김으로써 왼쪽부터 정렬을 완성해가는 방식 코드 def selection_sort(array): for i in range(len(array)): min_index = i for j in range(i + 1, len(array)): if array[min_index] > array[j]: min_index = j array[i], array[min_index] = arra..
사전 지식 탐색 많은 양의 데이터 중 원하는 데이터를 찾는 과정 자료구조 데이터를 표현하고, 관리하고, 처리하기 위한 구조 스택과 큐에 대해 잘 모른다면 아래 글을 참고할 것 2021/02/01 - [개발 일지/Algorithm] - 파이썬에서의 스택(Stack)과 큐(Queue) 재귀함수 자기 자신을 호출하는 함수. 수학의 점화식을 코드화한 것 점화식: 특정 함수를 자기보다 더 작은 변수와 함수의 관계로 표현한 것 재귀 함수는 점점 작아지는 자기 자신 + 종료 조건을 통해 동작한다. 그래프 그래프에 대해 잘 모른다면 아래 글을 참고할 것 2021/02/01 - [개발 일지/Algorithm] - [Data Structure] 그래프(Graph) DFS (깊이 우선 탐색, Depth-First Searc..
그래프(Graph) vertex(정점)과 edge(간선)으로 이루어진 자료구조 프로그래밍에서 이를 표현하는 방식으로는 인접 행렬과 인접 리스트가 있다. 인접 행렬 2차원 배열로 그래프의 연결 관계를 표현 INF = 987654321 graph = [ [0, 7, 5], [7, 0, INF], [5, INF, 0] ] # 0과 1의 연결 관계 graph[0][1] ( == graph[1][0]) 인접 리스트 연결 리스트 자료구조로 그래프의 연결 관계 표현 파이썬에서는 일반 리스트 자료형이 연결 리스트의 역할을 하므로 다음과 같이 구현한다. vertex = 3 graph = [[] for i in range(vertex)] # 0번 간선과의 연결 정보 graph[0].append((1, 7)) graph[0..