본문 바로가기

Algorithm11

[알고리즘] 최대공약수, 최소공배수 (유클리드 호제법) 1. 최대 공약수 최대공약수, 최대공배수를 사용하려면 소인수분해를 사용해야 합니다. 하지만 숫자가 크면 클수록 소인수분해의 횟수는 점점 증가하기 때문에 유클리드 호제법을 사용하면 시간복잡도는 단축이 됩니다. 유클리드 호제법은 명시적으로 기술된 가장 오래된 알고리즘으로, 무려 기원전 300년에 쓰여졌다고 합니다. 여기서 호제법이란 말은 두 수가 서로 상대방 수를 나누어서 결국 원하는 수를 얻는 알고리즘을 나타냅니다. 일반적으로 최대공약수를 구하는 가장 쉬운 방법은 2부터 모든 정수로 나누어 보는 방법이 있을 것 같은데 이의 경우 모든 정수를 나눠야 하므로 시간 복잡도는 O(N)이 됩니다. 유클리드 호제법을 사용한다면 때 a % b이 0이 될 때까지 반복을 해주기 때문에 시간 복잡도를 O(Log N)으로 줄.. 2021. 9. 28.
[알고리즘] DFS, BFS 기본 구현 설명 DFS, BFS 처음 볼때에는 정말로 햇갈렸습니다. 하지만 DFS와 BFS의 원리를 알고 DFS의 D의 영어가 Depth(깊이) BFS의 B의 영어가 Breadth(폭, 너비) 라는 것을 알고 있으면 쉽게 햇갈리지 않을거라고 생각합니다. 순열, 중복순열, 멱집합에 대해 앞 게시글에 작성을 하였는데 전부 DFS로 작성을 하였습니다. 물론 BFS로 풀면 풀 수 있지만 효율의 문제여서 상황에따라 BFS, DFS를 잘 쓰는게 중요합니다. 그래서 제가 생각하는 BFS를 쓰는 경우에는 찾고자 하는 그래프의 깊이가 얕거나, 최단 경로를 찾아야할 때에 가장 유용한 방법 이라고 생각합니다. BFS는 층에 개념으로 보는게 더 효율적입니다. 모든 층을 다 둘러 보았을때에 그 다음 층을 보러 가는 것입니다. 1. 사장 .. 2021. 7. 25.
[알고리즘] 멱집합에 대해서 (DFS) 설명 앞선 게시물에서는 순열, 중복순열에서 다루었는데 멱집합과 유사하지만 멱집합은 다른 조건이 붙습니다. 순열, 중복순열의 출력값의 길이가 전부 동일하지만 멱집합은 그렇지 않다는 점이며, 선택의 유무가 자유롭습니다. 멱집합 S={a, b}라 하면, P(S)={ ∅, {a}, {b}, S } 이다. 원소의 개수가 n개인 집합의 부분집합의 개수는 2^n(2의 n승)개이므로, 멱집합의 원소의 개수 또한 2^n(2의 n승)개가 된다. 멱집합은 위상 공간 등의 개념에 사용된다. (n승 맥북으로 어떻게 쓰나요..ㅠ 알려주실분..) 어찌되었든 순열, 중복순열은 n의 r 승의 경우의 수가 나오는 반면에, 멱집합은 2의 n승의 경우의 수가 나온다. 여기서만 보아도 멱집합의 특징을 볼 수있다. 좀 더 작은 경우의 수가 나.. 2021. 7. 25.
[알고리즘] 중복순열, 순열에 대해서 (DFS) 순열 : 서로 다른 n 개 중 r 개를 골라 순서를 고려해 나열한 경우의 수. 순열의 개념은 굉장히 쉽습니다. n개에서 -1씩 빼서 r이 될 때까지 그 숫자를 나열해 곱해주면 그 경우의 수가 나온다. 결국 펙토리얼과 같은개념 입니다. nPn=n(n-1)(n-2)···2·1=n! 중복순열로 이어진다면 n의 r 제곱으로 이어 져서 nPr 로 표현이 가능할 것입니다. 수학적인 개념도 중요하지만 개념을 하는것과 코딩으로 풀어내는것은 좀 더 높은 수준을 요구 하는 것으로 저에겐 보여집니다. 배우는 것 보다 남에게 누구에게 가르친다는것은 더 많은 것을 알아야 하는 것 처럼 코딩 한다는 것은 어떠한 상황을 컴퓨터에게 가르쳐줘야 하는 것과 같기 때문에 코딩을 하는 것은 더 어려운 것 같습니다. 중복순열이 중복이 가능하.. 2021. 7. 25.
[알고리즘] 소수 판별식 (에라토스테네스의 체) 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; .. 2021. 7. 21.
[알고리즘] Algorithm with Math / 정규표현식 컴퓨터가 단순하게 연산하기 때문에, 기본적인 컴퓨터 과학과 수학은 통하는 부분이 있습니다. 그러므로 수학을 학습하는 것은 프로그래밍의 기본을 탄탄히 하는 일입니다. 그러므로 수학은 프로그래밍에 많은 도움이 됩니다. 알고리즘 파트에서 다루는 수학은 중학교 수준의 수학입니다. 알고리즘 테스트(코딩 테스트)를 해결하는데 필요한 최소한의 수학을 다룹니다. 프로그래밍을 위한 최소한의 수학이기 때문에 학습해야만 하는 내용입니다. 알고리즘 문제에서 자주 다루는 최소한의 수학만 익혀, 적재적소에 활용할 수 있는 능력을 기르는 것이 가장 큰 목표입니다. 최근 코딩 테스트에 등장하는 알고리즘 문제는 단순히 "너 이 알고리즘 알아?"라고 물어보지 않습니다. 요즘 출제되는 문제는 "특정 방법을 사용해서 풀어 볼래?"라고 물어.. 2021. 7. 21.