분류 전체보기

    [웹 개발] 프론트와 백에서의 CORS 문제 해결하기

    [웹 개발] 프론트와 백에서의 CORS 문제 해결하기

    웹개발을 하면서 CORS 문제를 한번씩 맞닥뜨린 경험이 있을 것이다. 오류는 프론트에서 발생하는데 결국 근본적인 해결은 백에서 해야 하기 때문에 양측 작업자가 다 해결방법을 모르는 상황이라면 실무에서 처음 마주쳤을 때 상당히 곤혹스러울 수 있다. 사실 해결하는 방법 자체가 어려운 것은 아니라서 프론트엔드나 백엔드 개발자 중 한명이라도 정책에 대해 잘 알고 있으면 생각보다 간단히 문제를 해결할 수 있으니, 원리와 해결책을 잘 알아두도록 하자. 들어가기 전 알아둬야 할 용어 출처(Origin) Scheme(Protocol), Host, port 를 합친 것. 즉, 서버의 위치를 찾아가기 위해 필요한 가장 기본적인 것들을 합쳐놓은 것. ex) https://localhost:3000 출처 내의 포트 번호는 생..

    [알고리즘 공부] 다이나믹 프로그래밍(DP, 동적 계획법)

    다이나믹 프로그래밍(Dynamic Programming) 하나의 문제를 단 한번만 풀도록 하는 알고리즘 컴퓨터적인 사고력을 물어보기 적합해서 자주 출제되므로 확실하게 알아야 함. DP, 동적 계획법이라고도 함. 일반적으로 분할 정복 기법은 동일한 문제를 다시 푼다는 단점이 있음. (정렬과 같은 몇몇 요소에 대해서는 동일 문제 다시 풀지 않음. 그래서 병합이나 퀵 정렬은 매우 빠름). 특히 피보나치 수열 같은 경우에는 단순 분할 정복으로 풀면 심각한 비효율성을 낳음. (피보나치 수열 점화식: D[i] = D[i-1] + D[i-2]) 재귀로 풀게 되면 동일한 데이터를 반복적으로 불필요하게 계산해야함. 이미 해결한 문제를 다시 반복적으로 해결하기 때문에 비효율적. DP는 다음의 가정 하에 사용 가능 큰 문제..

    [알고리즘 공부] 이진트리의 구현과 순회 알고리즘

    [알고리즘 공부] 이진트리의 구현과 순회 알고리즘

    이진트리(Binary Tree) 가장 많이 사용되는 비선형 자료구조 트리 자료구조를 활용한 대표적인 예시 데이터의 탐색 속도 증진을 위해 사용하는 구조 트리를 제대로 구현하기 위해서는 포인터를 사용해야 함. 포인터를 사용하면 특정한 root에서 자식 노드로 접근하는게 훨씬 간단하게 이루어질 수 있음. 힙 정렬을 구현할 때는 완전 이진 트리를 사용했기 때문에 배열로 표현할 수 있었지만, 완전 이진 트리가 아닌 이진 트리는 배열로 표현하기 어렵기 때문(∵ 데이터 낭비. 오른쪽으로만 뻗는 트리의 인덱스를 생각해 볼 것). 이진 트리에서 데이터를 탐색하는 법 3가지 전위 순회(Preorder Traversal) ① 먼저 자기 자신을 처리 ② 왼쪽 자식 방문 ③ 오른쪽 자식 방문 중위 순회(Inorder Trav..

    [알고리즘 공부] 합집합 찾기(Union-Find), 크루스칼 알고리즘

    유니온 파인드(Union-Find, 합집합 찾기) 대표적인 그래프 알고리즘. 서로소 집합(Disjoint-Set) 알고리즘이라고도 부름. 여러개의 노드가 존재할 때 2개의 노드를 선택해, 현재 이 노드들이 서로 같은 그래프에 속하는지 판별. 나중에 strongly connected component, 크루스칼(Kruskal) 알고리즘 등과 같은 고급 알고리즘에서도 적용되는 원리로 활용도가 높으므로 잘 공부하고 넘어가는 것이 좋음. - 합침(Union) : 부모를 합칠 때는 일반적으로 더 작은 값 쪽으로 합침 - Find 알고리즘 : 2개 노드의 부모 노드를 확인해 현재 같은 집합에 속하는지 확인하는 알고리즘 자식 1 2 3 4 5 6 부모 1 2 3 4 5 6 맨 처음에는 집합 자체가 각각 다 자기 자신..

    [알고리즘 공부] BFS & DFS (C++)

    [알고리즘 공부] BFS & DFS (C++)

    들어가기 전) 스택 & 큐 스택과 큐는 컴퓨터공학에서 가장 기본이 되는 자료구조. #include #include 로 C++ STL 라이브러리 사용 가능 stack은 s.top(), queue는 q.front() 로 가장 위/앞의 값을 가져올 수 있다. BFS(Breadth First Searct, 너비 우선 탐색) 탐색할 때 너비를 우선으로 해서 탐색 수행하는 탐색 알고리즘 ‘최단경로’를 찾아준다는 점에서 최단 길이를 보장해야할 때 많이 사용. 준비물은 큐(Queue) 맹목적인 탐색을 하고자 할 때 사용하는 탐색 기법. 맨 처음에는 시작 노드를 큐에 삽입하면서 시작. 시작 노드는 방문 처리 후, 다음의 간단한 알고리즘에 따라 작동. 큐에서 하나의 노드를 꺼낸다. 해당 노드에 연결된 노드 중 방문하지 않..

    [알고리즘 공부] 힙 정렬, 계수 정렬 (C언어)

    힙 정렬 힙을 이용해 데이터를 정렬 전체 시간 복잡도: O(N*logN) - 데이터 개수가 N개일 때 N/2개의 데이터에만 힙생성 알고리즘(Heapify)를 적용해주면 최대힙이 만들어짐. 사실상 O(N*logN) ≓ O(N/2*logN) => 병합 정렬과 퀵 정렬만큼 빠른 정렬 알고리즘. 고급 프로그래밍 기법으로 갈수록 힙의 개념이 자주 등장하기 때문에 반드시 알고 넘어가야 함. 힙 트리 구조를 이용하는 정렬 방법. 병합정렬과 달리 별도로 추가적인 배열이 필요하지 않기 때문에 메모리 측면에서 몹시 효율적. 항상 O(N*logN)을 보장할 수 있다는 점에서 강력한 정렬 알고리즘. 이론적으로는 퀵/병합 정렬보다 효율적이라고 할 수 있음. 하지만 속도만 가지고 비교하면 평균적으로 퀵 정렬이 더 빨라서 힙 정렬..

    [알고리즘 공부] sort (C++ STL)

    C++ STL ❯❯ sort() #include #include using namespace std; int main() { int a[10] = {9,3,5,4,1,10,8,6,7,2}; sort(a, a+10);// 메모리 주소를 넣어주면 됨 for (int i = 0; i 내림차순 bool compare1(int a, int b) { return a > b; } int main() { int a[10] = {9, 3, 5, 4, 1, 10, 8, 6, 7, 2}; sort(a, a + 10, compare1);// 1 2 3 4 5 6 7 8 9 10 sort(a, a + 10, compare2);// 10 9 8 7 6 5 4 3 2 1 ..

    [알고리즘 공부] 정렬 - 선택/버블/삽입/퀵 정렬 (C언어)

    선택 정렬 가장 작은 것을 선택해 앞으로 보낸다. 시간복잡도: n(n+1)/2 => O(N^2) => 다른 알고리즘과 비교했을 때 비효율적인 편 #include int main() { int i, j, min, idx, tmp; int array[10] = {1, 10, 5, 8, 7, 6, 4, 3, 2, 9}; for (i = 0; i array[j]) { min = array[j]; idx = j; } } tmp = array[idx]; array[idx] = array[i]; array[i] = tmp; } for (i = 0; i < 10; ++i) { printf("%d ", array..