코테/자료구조, 알고리즘

    [알고리즘] 최대공약수, 최소공배수 (유클리드 호제법)

    1. 최대 공약수 최대공약수, 최대공배수를 사용하려면 소인수분해를 사용해야 합니다. 하지만 숫자가 크면 클수록 소인수분해의 횟수는 점점 증가하기 때문에 유클리드 호제법을 사용하면 시간복잡도는 단축이 됩니다. 유클리드 호제법은 명시적으로 기술된 가장 오래된 알고리즘으로, 무려 기원전 300년에 쓰여졌다고 합니다. 여기서 호제법이란 말은 두 수가 서로 상대방 수를 나누어서 결국 원하는 수를 얻는 알고리즘을 나타냅니다. 일반적으로 최대공약수를 구하는 가장 쉬운 방법은 2부터 모든 정수로 나누어 보는 방법이 있을 것 같은데 이의 경우 모든 정수를 나눠야 하므로 시간 복잡도는 O(N)이 됩니다. 유클리드 호제법을 사용한다면 때 a % b이 0이 될 때까지 반복을 해주기 때문에 시간 복잡도를 O(Log N)으로 줄..

    [알고리즘] DFS, BFS 기본 구현

    설명 DFS, BFS 처음 볼때에는 정말로 햇갈렸습니다. 하지만 DFS와 BFS의 원리를 알고 DFS의 D의 영어가 Depth(깊이) BFS의 B의 영어가 Breadth(폭, 너비) 라는 것을 알고 있으면 쉽게 햇갈리지 않을거라고 생각합니다. 순열, 중복순열, 멱집합에 대해 앞 게시글에 작성을 하였는데 전부 DFS로 작성을 하였습니다. 물론 BFS로 풀면 풀 수 있지만 효율의 문제여서 상황에따라 BFS, DFS를 잘 쓰는게 중요합니다. 그래서 제가 생각하는 BFS를 쓰는 경우에는 찾고자 하는 그래프의 깊이가 얕거나, 최단 경로를 찾아야할 때에 가장 유용한 방법 이라고 생각합니다. BFS는 층에 개념으로 보는게 더 효율적입니다. 모든 층을 다 둘러 보았을때에 그 다음 층을 보러 가는 것입니다. 1. 사장 ..

    [알고리즘] 멱집합에 대해서 (DFS)

    설명 앞선 게시물에서는 순열, 중복순열에서 다루었는데 멱집합과 유사하지만 멱집합은 다른 조건이 붙습니다. 순열, 중복순열의 출력값의 길이가 전부 동일하지만 멱집합은 그렇지 않다는 점이며, 선택의 유무가 자유롭습니다. 멱집합 S={a, b}라 하면, P(S)={ ∅, {a}, {b}, S } 이다. 원소의 개수가 n개인 집합의 부분집합의 개수는 2^n(2의 n승)개이므로, 멱집합의 원소의 개수 또한 2^n(2의 n승)개가 된다. 멱집합은 위상 공간 등의 개념에 사용된다. (n승 맥북으로 어떻게 쓰나요..ㅠ 알려주실분..) 어찌되었든 순열, 중복순열은 n의 r 승의 경우의 수가 나오는 반면에, 멱집합은 2의 n승의 경우의 수가 나온다. 여기서만 보아도 멱집합의 특징을 볼 수있다. 좀 더 작은 경우의 수가 나..

    [알고리즘] 중복순열, 순열에 대해서 (DFS)

    순열 : 서로 다른 n 개 중 r 개를 골라 순서를 고려해 나열한 경우의 수. 순열의 개념은 굉장히 쉽습니다. n개에서 -1씩 빼서 r이 될 때까지 그 숫자를 나열해 곱해주면 그 경우의 수가 나온다. 결국 펙토리얼과 같은개념 입니다. nPn=n(n-1)(n-2)···2·1=n! 중복순열로 이어진다면 n의 r 제곱으로 이어 져서 nPr 로 표현이 가능할 것입니다. 수학적인 개념도 중요하지만 개념을 하는것과 코딩으로 풀어내는것은 좀 더 높은 수준을 요구 하는 것으로 저에겐 보여집니다. 배우는 것 보다 남에게 누구에게 가르친다는것은 더 많은 것을 알아야 하는 것 처럼 코딩 한다는 것은 어떠한 상황을 컴퓨터에게 가르쳐줘야 하는 것과 같기 때문에 코딩을 하는 것은 더 어려운 것 같습니다. 중복순열이 중복이 가능하..

    [알고리즘] 소수 판별식 (에라토스테네스의 체)

    1. num 사이의 숫자를 모두 나눠서 확인하는 방법 function isPrime(num) { for(let i = 2; num > i; i++) { if(num % i === 0) { return false; } } return num > 1; } 2. num 제곱근 까지만 확인 하는 방법 function isPrime(num) { let sqrt = parseInt(Math.sqrt(num)); // num에 제곱근 후 소수점 버림 if (num === 1) { return false; } if (num === 2) { return true; } if (num % 2 === 0) { return false; } // 1, 2에 대한 경우의 수와 2의 배수는 미리 걸러냄 for (let i = 3; ..

    [알고리즘] Algorithm with Math / 정규표현식

    컴퓨터가 단순하게 연산하기 때문에, 기본적인 컴퓨터 과학과 수학은 통하는 부분이 있습니다. 그러므로 수학을 학습하는 것은 프로그래밍의 기본을 탄탄히 하는 일입니다. 그러므로 수학은 프로그래밍에 많은 도움이 됩니다. 알고리즘 파트에서 다루는 수학은 중학교 수준의 수학입니다. 알고리즘 테스트(코딩 테스트)를 해결하는데 필요한 최소한의 수학을 다룹니다. 프로그래밍을 위한 최소한의 수학이기 때문에 학습해야만 하는 내용입니다. 알고리즘 문제에서 자주 다루는 최소한의 수학만 익혀, 적재적소에 활용할 수 있는 능력을 기르는 것이 가장 큰 목표입니다. 최근 코딩 테스트에 등장하는 알고리즘 문제는 단순히 "너 이 알고리즘 알아?"라고 물어보지 않습니다. 요즘 출제되는 문제는 "특정 방법을 사용해서 풀어 볼래?"라고 물어..

    [알고리즘] Time Complexity / greedy Algorithm / implementation

    알고리즘은 문제를 해결하는 최선의 선택입니다. 1. 문제를 이해하고 2. 전략을 세우고 (수도코드, 흐름의 그림, 페어에게 설명) 3. 이에 따라 코드 작성으로 문제 해결 개발자로서 만나게 될 대부분의 개발 태스크는 알고리즘 문제만큼 어렵지 않습니다. 그러나 새로운 문제에 봉착했을 때, 전략과 알고리즘을 구상하여 실제로 코드로 구현해 보는 경험은 매우 중요합니다. 많은 기업에서 주니어 개발자를 채용할 때에, 알고리즘 풀이를 통해 지원자의 역량을 가늠합니다. 알고리즘 풀이를 통해 지원자의 로직과 문제해결 방식을 확인하고, 이를 통해 개발자다운 사고방식을 보게 된다고 합니다. 1. Time Complexity 알고리즘 문제를 풀때 해결하는것도 가장 중요하지만 효율적인 알고리즘을 찾는 것 또한 중요합니다. 효..

    [알고리즘] Graph / Tree / BST

    1. Graph 컴퓨터 공학에서 이야기 하는 자료구조 그래프는 전혀 다른 모습을 가지고 있습니다. 자료구조의 그래프는 마치 거미줄처럼 여러개의 점들이 선으로 이어져 있는 복잡한 네트워크 망과 같은 모습을 가지고 있습니다. 그래프는 여러개의 점들이 서로 복잡하게 연결되어 있는 관계를 표현한 자료구조입니다. 직접적인 관계가 있는 경우 두 점 사이를 이어주는 선이 있습니다. 간접적인 관계라면 몇 개의 점과 선에 걸쳐 이어집니다. 하나의 점을 그래프에서는 정점(vertex)이라고 표현하고, 하나의 선은 간선(edge) 이라고 합니다. 알아둬야 할 그래프 용어들 무(방)향그래프(undirected graph): 서울에서 부산으로 갈 수 있듯, 반대로 부산에서 서울로 가는것도 가능합니다. 단방향(directed) ..

    [자료구조] 자료구조 기초 Stack, Queue

    자료구조? 자료구조란 여러 데이터들의 묶음을 저장하고, 사용하는 방법을 정의한 것입니다. 자료구조는 자료의 집합을 구조화하고, 이를 표현하는 데에 초점이 맞춰져 있습니다. 이미 자료구조를 알게 모르게 많이 접했습니다. 사람이 사용하기에 편리하려고, 사용하기 좋으려고 만들어진 것이 자료구조입니다. 자주 등장하는 네 가지의 자료구조 Stack, Queue, Tree, Graph 대부분의 자료구조는 특정한 상황에 놓인 문제를 해결하는 데에 특화되어 있습니다. 따라서 많은 자료구조를 알아두면, 어떠한 상황이 닥쳤을 때 적합한 자료구조를 빠르고 정확하게 적용하여 문제를 해결할 수 있습니다. 이것은 문제 해결력을 필요로하는 알고리즘 테스트(코딩 테스트)와 굉장히 밀접한 연관성이 있습니다. 특정 문제를 해결하는 데에..

    [자료구조/알고리즘] JSON, Tree UI, 재귀함수 과제

    JSON의 탄생 배경 JSON은 JavaScript Object Notation의 줄임말로, 데이터 교환을 위해 만들어진 객체 형태의 포맷입니다. 네트워크를 통해, 어떤 객체 내용을 다른 프로그램에게 전송한다고 가정하겠습니다. 이 객체 내용을 일종의 메신저 혹은 채팅 프로그램에서 쓰는 하나의 메시지 입니다. const message = { sender: "김코딩", receiver: "박해커", message: "해커야 오늘 저녁 같이 먹을래?", createdAt: "2021-01-12 10:10:10" } 메시지 객체가 전송 가능하려면, 메시지를 보내는 발신자와 메시지를 받는 수신자가 같은 프로그램을 사용하거나, 문자열처럼 범용적으로 읽을 수 있는 형태여야 합니다. 전송가능한 조건 (transfera..