본문 바로가기

분류 전체보기

파이썬으로 메일 보내기 이메일은 SMTP(Simple Mail Transfer Protocol) 이라는 프로토콜을 사용합니다. 파이썬으로도 SMTP를 이용하여 메일을 발송할 수 있습니다. 파이썬에서는 smtplib이라는 라이브러리를 이용하여 메일을 보내게 됩니다. smtplib는 기본적으로 python에서 제공하는 라이브러리이기 때문에 별도로 설치하지 않아도 사용이 가능한 것으로 알고 있습니다. 하지만 어떤 이유에서든 제대로 import가 되지 않으신다면 아래의 pip install을 이용하여 설치하시기 바랍니다. pip install smtplib 메일서버와 통신하기 위한 smtplib를 사용할 준비는 완료되었지만, smtplib는 통신을 위한 도구일뿐 이메일 자체를 만들어주지는 않습니다. 실제로 상대방에게 보낼 이메일은 e..
Ubuntu Atom 설치하기 Atom 페이지http://flight-manual.atom.io/getting-started/sections/installing-atom/#platform-linux Debian and Ubuntu (deb/apt)To install Atom on Debian, Ubuntu, or related distributions, add our official package repository to your system by running the following commands:curl -L https://packagecloud.io/AtomEditor/atom/gpgkey | sudo apt-key add - sudo sh -c 'echo "deb [arch=amd64] https://packagecloud..
에라스토테네스의 체 (소수 구하기) 소수 구하기 알고리즘은 간단하지만 확실하게 정리해두지 않으면 헷갈리기 좋은 문제라고 생각한다. 하지만 다른 알고리즘들과 마찬가지로 한번만 확실하게 이해해두면 바로바로 구할 수 있기 때문에 한번정도는 정리해두는 것이 좋다. 소수는 정규 교육과정을 거친 사람은 누구나 이해하고 있을만큼 간단한 개념이다. 1을 제외하고 자기 자신으로만 나누어 떨어지는 수. 이것이 소수의 정의이다. 소수에는 많은 수학적 이론과 증명이 배경에 있겠지만 과감히 생략하고 이 정의에 입각하여 알고리즘적으로 소수를 판가름 하는 코드를 작성해보겠다. 소수에 대해서는 아래의 링크를 참고하자. 소수(수론) - 나무위키https://namu.wiki/w/%EC%86%8C%EC%88%98(%EC%88%98%EB%A1%A0) 소수는 1과 자기 자신..
트라이(Trie) 문자열 관련 알고리즘은 정말 다루기 힘든편에 속한다. 하지만 그중에도 잘만 이해하면 유용하게 사용할 수 있는 알고리즘이 몇있다. 그중에서 트라이(Trie)에 대해서 얘기해보고자 한다. 트라이 - 나무위키https://namu.wiki/w/%ED%8A%B8%EB%9D%BC%EC%9D%B4 트라이 알고리즘은 여러 단어들이 주어진 경우, 특정 단어가 예시로 주어진 단어들 중에 포함되는가를 빠르게 파악할 수 있는 알고리즘이다. 예를들어 n개의 단어가 주어져있고, 각 문자열의 길이가 m인 경우 단순하게 이 단어들중에 특정 단어가 포함되어있는지 확인하려면 최대 O(nm)의 시간 복잡도를 갖게된다. 하지만 트라이를 사용하면 시간복잡도가 O(m)으로 압도적으로 단축되게 된다. 어떻게 이렇게 시간이 줄어들 수 있는지 생..
트리의 순회 트리 구조를 순회하는 방법은 일반적으로 전위, 중위, 후위 순회 세가지 방법이 있다. 방법이 복잡하지는 않지만 정리해두지 않으면 헷갈리니 기회가 되면 한번 정리해보고 직접 코드로 구현해보는 것이 좋을 것같다. 전위 순회는 루트 노드부터 시작해서 왼쪽 서브트리를 타기 전에 노드의 자료를 확인하고 그다음 왼쪽 서브트리로 이동해서 마찬가지로 전위 순회를 하게 되어있고, 왼쪽 서브트리에 대한 전위 순회를 마친 후 우측 서브트리의 전위 순회가 일어난다. 중위 순회는 루트 노드에서 시작해서 좌측 서브트리에 대한 중위 순회가 먼저 일어나고, 중위 순회가 더이상 일어날 수 없는 지점에서 노드의 자료를 확인하면서 좌측 서브트리의 중위 순회를 종료시킨다. 그다음 우측 서브트리의 중위 순회가 일어나게 된다. 후위 순회는 루..
16. 퀵 정렬(Quick Sort)과 병합 정렬(Merge Sort) 정렬을 구현하는데 있어 가장 간편하고 직관적인 알고리즘은 버블 정렬과 선택 정렬일 것입니다. 하지만 O(n^2)의 시간 복잡도를 갖고 있어 빠른 정렬에는 적합하지 않다는 단점을 갖고 있습니다. 자료가 많을 때 빠른 정렬을 하기 위해서는 일반적으로 퀵 정렬이나 병합 정렬을 사용합니다. 퀵 정렬과 병합 정렬은 모두 평균적으로 O(nlogn)의 시간 복잡도를 갖고 있는 정렬 알고리즘입니다. 이러한 시간 복잡도가 가능한 것은 두 알고리즘 모두 재귀적으로 범위를 분할하면서 정렬하기 때문입니다. 퀵 정렬 - 위키백과https://ko.wikipedia.org/wiki/%ED%80%B5_%EC%A0%95%EB%A0%AC 합병 정렬 - 위키백과https://ko.wikipedia.org/wiki/%ED%95%A9%EB..
LIS (Longest increasing subsequence) nlogn 해법 LIS(Longest Increasing Subsequence) 정의컴퓨터 공학에서, 최장 증가 부분 수열(Longest Increasing Subsequence) 문제는, 주어진 수열에서 오름차순으로 정렬된 가장 긴 부분수열을 찾는 문제이다. 여기서의 부분 수열은 연속적이거나 유일할 필요는 없다. 최장 증가 부분 수열 - 위키백과https://ko.wikipedia.org/wiki/%EC%B5%9C%EC%9E%A5_%EC%A6%9D%EA%B0%80_%EB%B6%80%EB%B6%84_%EC%88%98%EC%97%B4 LIS 문제는 수열에서 주어진 순서에서 벗어나지 않으면서 숫자가 증가하는 가장 긴 부분수열을 찾는 문제이다. 예를 들어 6개의 숫자가 주어져있다고 하자. 0 1 2 3 4 5 10 20 10..
Arrays.binarySearch() 사용 지금까지 매번 구현해서 사용했는데 Arrays API에 이분탐색 함수가 있었다. 좀 찾아볼걸. 하지만 일반적으로 자주 구현하던 방식이랑 차이가 있어서 주의해야하는 부분이 있다. 일단 나는 이분 탐색은 무조건 양수를 반환하게 구현한데 반해서 Arrays 라이브러리에 포함된 binarySearch() 함수는 음수값을 반환하는 경우가 있다. 이게 우리가 원하는 타겟이 딱 맞게 존재하는 경우에는 양수가 반환되는데 정확히 같은 값이 아니면 배열에서 자기 위치를 찾아 음수로 반환한다는 특징이 있다. 예를 들어 2, 4, 7, 9 이라는 숫자 배열이 있다고 하자. 배열이 0부터 시작하는 경우, 정상적으로 이분 탐색이 이뤄진다면 2를 찾을 때 0을 반환하고, 9를 찾는다면 3을 반환할 것이다. 이것은 일반적인 탐색 결..