파이썬 변수
·
Python/Syntax
변수 변수의 범위 지역 변수 함수 내에서만 사용 가능한 변수이다. 전역 변수 어디에서든 접근 가능한 변수이다. global 키워드를 붙여서 전역 변수로 사용할 수 있다. price = 1000 def sale(): global price price = 500 sale() print(price) ''' stdout 500 ''' docstring 함수의 매뉴얼을 작성하는 방식이다. help(함수명) 함수를 호출할 때 나오는 내용이다. 함수 코드 블록 앞에 문자열로 지정한다. def calcsum(n): """1 ~ n까지의 합계를 구해 리턴한다""" total = 0 for i in range(n+1): total += i return total help(calc..
파이썬 문자열
·
Python/Syntax
문자열 큰 따옴표나 작은 따옴표로 묶으면 문자열이다. 여러 줄을 표현할 때는 끝에 \를 붙이고 줄바꿈을 하거나, 문자열을 삼중 따옴표(''', """)로 묶으면 된다. 이스케이프 시퀀스(escape sequence, 확장열) 확장열 설명 \n 개행 \t 탭 \" 큰따옴표 \' 작은따옴표 \ \ 문자 아스키 코드 다음과 같은 함수로 아스키 코드와 문자를 서로 변환할 수 있다. print(ord('a')) print(chr(98)) for c in range(ord('A'), ord('Z')+1): print(chr(c), end='') ''' stdout 97 b ABCDEFGHIJKLMNOPQRST..
파이썬 인수
·
Python/Syntax
인수 함수로 값을 전달했을 때 이를 저장하는 변수 함수 내부에서 사용한다. 가변 인수 인수의 수가 고정되지 않고 호출 시 원하는 만큼 인수를 지정할 수 있다. 튜플로 받아서 처리한다. 일반 인수보다 뒤에 위치해야 한다. 함수 당 하나만 사용할 수 있다. 예시 인수명 앞에 * 를 붙여서 가변 인수임을 표시한다. def intsum(*ints): total = 0 for num in ints: total += num return total print(intsum(1, 2, 3)) # ints = (1, 2, 3) print(intsum(5, 7, 9, 11, 13)) # ints = (5, 7, 9, 11, 13) print(intsum(8, 9, 6, 2, 9, 7, 5, 8)) ''&#39..
파이썬 입력 함수
·
Python/Function
입력 함수 input 변수 = input('출력 내용') 리턴 타입이 문자열이다. 숫자 등 다른 형식으로 쓰려면 형변환해야 한다. 예제 age = int(input('몇 살이세요? ')) print(age)
파이썬 출력 함수
·
Python/Function
출력 함수 print print(출력 내용[, sep = 구분자][, end = 끝 문자]) sep의 기본값은 ' ', end의 기본값은 '\n'이다. 리턴 값이 None이다. 예시 print("ab", "cd", sep = " ---> ", end = "\n") ''' stdout ab ---> cd ''' pprint pprint 모듈 리스트 등을 예쁘게 출력해준다. from pprint import pprint dict_list = [{"First": 1, "Second": 2, "Third": 3}, \ {"Hello": "World"}, {"Python": "Django"}] pprint(dict_list) '&#39..
멀티캠퍼스 파이썬
·
Python
멀티캠퍼스 파이썬 함수(Function) 문자열(String) 리스트(List) 튜플(Tuple) 사전(Dictionary) 집합(Set) 컬렉션 관리 표준 모듈 예외 처리 파일 클래스(Class) 모듈과 패키지 고급 문법 그 외 Underscore(_) : 직접 사용하지는 않지만 필요한 변수에 할당한다. ex. for _ in range(5) 소스 형식 들여쓰기로 코드 블록을 구분한다. 대소문자를 구분한다. 주석은 #를 맨 앞에 붙이고, 여러 줄은 각각 앞에 붙여야 한다. 하드웨어 메모리 DRAM(Dynamic Random Access Memory) 커패시터 기반이기 때문에 자연방전이 발생한다. Dynamic하게 주기적으로 Refresh 해야 하므로 지연이 발생한다. 저렴하여 RAM에 많이 사용한다. ..
리액트 gh-pages 적용
·
Web/React
리액트 gh-pages 적용 리액트로 만든 사이트를 github에서 호스팅할 경우, gh-pages 패키지를 사용하면 편하다. 일반적인 깃허브 페이지는 빌드한 파일들을 해당 브랜치에 넣어두는데, 이 패키지를 사용하면 원격 리포지토리에 gh-pages라는 브랜치가 생기고, 거기에 빌드하게 된다. 적용 과정 다음 명령어 중 하나로 gh-pages 패키지를 설치한다. $ npm install gh-pages $ yarn add gh-pages --save 옵션은 관습적으로 사용하는 것 같다. (https://xtring-dev.tistory.com/entry/NPM-npm-install-%ED%95%A0-%EB%95%8C-save%EB%A5%BC-%ED%95%A8%EA%BB%98-%EC%9E%85%EB%A0%..
VSCode No such file or directory 에러
·
Utility/VSCode
VSCode No such file or directory 에러 윈도우10에서 VSCode의 Code Runner 플러그인을 설치했다. 직접 g++로 .cpp 파일을 컴파일할 수 있었는데, Code Runner로 실행하면 에러가 발생했다. 원인 찾아보니 디렉토리 경로가 \로 연결되고, 이 경로는 "로 묶여있었다. 경로의 마지막 \" 부분에서 escape 처리가 되어서 파싱을 제대로 못하는 문제였다. 해결 VSCode의 설정(Ctrl + ,)으로 들어가서 오른쪽 위의 Open Settings를 클릭한다. 아래 문구를 추가한다. { ... "code-runner.runInTerminal": true, "code-runner.terminalRoot": "/", } code-runner.runInTerminal..
Django 채팅 앱 만들기
·
Web/Django
Django 채팅 앱 만들기 channels 공식 문서에 정리가 잘 되어있다. https://channels.readthedocs.io/en/latest/tutorial/part_1.html 장고 기본 페이지 생성 개발 환경 윈도우10, Anaconda3 가상환경에서 수행했다. $ conda --version conda 4.10.1 $ conda create -n chat python=3.8 $ conda activate chat $ python --version Python 3.8.11 기본적으로 필요한 라이브러리들을 설치한다. $ pip install Django $ python -m django --version 3.2.6 $ pip install channels $ python -c 'im..
Github 계정 2개 SSH 연결
·
Git
Github 계정 2개 SSH 연결 기존에 사용하던 ssh key로 깃허브의 다른 계정에 연결하려 했으나 key is already in use 에러가 발생했다. 깃허브에서 ssh key의 중복을 허용하지 않아서 발생하는 문제이다. 따라서 ssh key를 하나 더 만들어서 등록해야 하는데, 여기서 따로 설정해야 하는 부분이 있다. ssh 키 생성 ssh key를 하나 더 만들 때 기존의 키와 겹칠까봐 아래와 같은 과정을 거쳤다. 단순히 새로 만들 키의 이름을 ssh-keygen 명령어 실행 시 처음에 설정해줘도 된다. ~/.ssh 폴더에서 기존에 사용하던 키의 이름을 변경하고(백업), 다시 ssh 키를 생성한다. id_rsa, id_rsa.pub의 이름을 id_rsa.backup, id_rsa.pub.b..
팟플레이어 검은 화면
·
Utility
팟플레이어 검은 화면 서피스 프로7에서 팟플레이어를 실행하니 검은 화면에 소리만 재생되는 현상이 발생했다. 해결 방법 환경 설정(F5)를 눌러 영상 탭의 영상 출력 장치를 Video Renderer 등 다른 렌더러로 변경, 종료 후 다시 실행한다. 만약 이렇게 했는데 공포스러운 재생 화면이 나올 경우(굉장히 어둡고 빨간 색만 나옴) Q를 눌러 설정을 초기화한다.
VSCode Settings.json에서 인덴트 설정
·
Utility/VSCode
VSCode Settings.json에서 인덴트 설정 Ctrl + ,로 설정에 들어간 뒤 우측 상단의 Open Settings(JSON) 클릭 후 아래 내용 삽입 { "[markdown]": { "editor.tabSize": 2, "editor.insertSpaces": true, }, "[html]": { "editor.insertSpaces": true, "editor.tabSize": 2 }, "[css]": { "editor.insertSpaces": true, "editor.tabSize": 2 }, "[javascript]": { "editor.insertSpaces": true, "editor.tabSize": 2 }, } 참고 https://stackoverflow.com/question..
윈도우10 갑자기 업데이트
·
Windows
윈도우10 갑자기 업데이트 켜놓고 딴짓을 하는데 갑자기 컴퓨터가 종료되더니 업데이트를 시작했다. 서비스에서 윈도우 업데이트를 사용안함으로 해도 소용없다. https://answers.microsoft.com/ko-kr/windows/forum/windows_10-update/%EC%9C%88%EB%8F%84%EC%9A%B010-home/e7f6ce54-eeb7-4cdf-baf6-e80199a70797 윈도우10 홈 에디션은 로컬 그룹 정책 편집기를 지원하지 않는데, 이를 직접 설치해도 적용되지 않는다고 한다. 결국 홈 에디션에서 자동 업데이트 기능을 끌 수는 없는 것 같다. 대신 활동 시간을 변경하여 자동으로 컴퓨터가 꺼지는 상황은 예방할 수 있는 것 같다.
ㅎㅏㄴㄱㅡㄹㅇㅣ ㅇㅣㅅㅏㅇㅎㅏㄱㅔ ㅊㅕㅈㅣㄹㄸㅐ
·
Windows
해결 방법Win + . 를 누르면 이모지 창이 뜨는데, 이걸 꺼주면 원래대로 돌아온다.혹은 Win + R로 실행 창에 들어가서 tabtip을 입력하면 가상 키보드가 뜨는데, 이걸 꺼주면 원래대로 돌아온다.한 번 실행하면 백그라운드에서 계속 켜져있기 때문에, 두 번째부터는 작업관리자에서 프로세스를 종료하고 다시 켜야 한다.원인 분석윈도우10에서 Win + H 키를 누르면 음성 받아쓰기 모드로 전환된다.한국어의 경우 지원되지 않는데, 이 기능이 계속 활성화되어 자음과 모음이 분리되는 현상이 발생하는 것 같다.받아쓰기 모드를 해제하려면 소프트웨어적으로 타이핑을 하면 되는 듯하다.
VirtualBox "가상머신의 세션을 열 수 없습니다" 에러
·
Utility/VirtualBox
VirtualBox "가상머신의 세션을 열 수 없습니다" 에러 오랜만에 가상머신을 작동시키는데 에러가 발생했다. The virtual machine has terminated unexpectedly during startup with exit code -1073741819 (0xc0000005). More details may be available in ~ 결과 코드 : E_FAIL (0x80004005) 구성 요소 : MachineWrap 인터페이스 : IMachine 원인은 Fasoo DRM Client for NHN Mobile Wix였다. 네이버 e-book을 볼 때 설치했던 프로그램같다. 닫아야하는 프로세스들을 종료하고 삭제 후 리부팅하면 된다. 참고 : https://besttech.tist..
04. 그리디(Greedy) 알고리즘
·
Algorithm/알기 쉬운 알고리즘
알기쉬운 알고리즘(양성봉 저, 생능 출판) 책을 바탕으로 작성한 내용이다. 04. 그리디(Greedy) 알고리즘 최적화 문제를 해결하는 알고리즘이다. 입력 데이터 간의 관계를 고려하지 않고, 수행 과정에서 최솟값 또는 최댓값을 가진 데이터를 선택한다. 근시안적 선택으로 부분적인 최적해를 찾고, 이를 모아서 문제 전체의 최적해를 찾는다. 한번 선택하면 번복하지 않아서 알고리즘들이 비교적 단순하다. 4.1 동전 거스름돈 거스름돈의 동전 개수를 가장 적게 받는 방법 남은 액수를 초과하지 않는 조건에서 가장 큰 액면의 동전을 취하는 방법을 사용한다. Pseudo Code int CountCoin(int change) { int n500 = n100 = n50 = n10 = n1 = 0; while (change..
허프만 압축(Huffman Coding)
·
카테고리 없음
허프만 압축(Huffman Coding) 문자를 0과 1로 표현하여 압축하는 방법이다. 접두부 특성(Prefix Property)가 존재한다. 압축된 이진 코드가 다른 이진 코드의 접두부가 되지 않는 특성을 의미한다. https://ko.wikipedia.org/wiki/%EC%95%9E%EC%9E%90%EB%A6%AC_%EB%B6%80%ED%98%B8 예를 들면, 변환된 이진 코드가 {1, 10} 두 가지라면 "1"은 "10"의 앞부분에 포함되므로 이는 접두부 특성이 없는 것이다. 반면에 {0, 10} 의 경우 "0"과 "10"은 반드시 구분되므로 접두부 특성을 가진다. 알고리즘 각 문자의 출현 빈도수에 따라 이진 코드를 할당한다. 빈도수가 많을수록 짧은 이진 코드를 할당하는게 효율적이다. 이진 트리와..
작업 스케줄링(Task Scheduling)
·
Algorithm/알기 쉬운 알고리즘
작업 스케줄링(Task Scheduling) 기계에서 수행되는 n개의 작업들을 수행 시간이 중복되지 않도록 가장 적은 수의 기계에 배정하는 문제이다. 각 작업은 시작시간과 종료시간이 정해져있다. 발표 시간이 정해진 학술대회에서 발표자들을 강의실에 배정하는 문제와 같다. 알고리즘 다음과 같은 그리디 알고리즘이 존재한다. 빠른 시작 시간 작업 우선 (Earliest Start Time First) 빠른 종료 시간 작업 우선 (Earliest Finish Time First) 짧은 작업 우선 (Shortest Job First) 긴 작업 우선 (Longest Job First) 여기서는 최적해를 찾기 위해 첫 번째 방법을 선택한다. 빠른 시작 시간 작업 우선 (Earliest Start Time First) ..
집합 커버 문제 (Set Cover Problem)
·
Algorithm/알기 쉬운 알고리즘
집합 커버 문제 (Set Cover Problem) 전체 집합 U와, 그 부분 집합 Si들을 원소로 갖는 집합 F가 있다고 하자. F의 원소인 Si들을 합집합하여 전체 집합 U와 같아지는 집합 Si들의 최소 개수를 찾는 문제이다. F에 있는 집합들의 모든 조합을 하나씩 찾을 경우 만약 F의 원소의 개수가 n개이면 나올 수 있는 경우의 수는 (2n - 1)개이고, n이 증가함에 따라 이 방식으로 최적해를 찾는 것은 실질적으로 불가능하다. 따라서 최적해 대신 최적해에 근접한 근사해(Approximation Solution)을 찾아야 한다. U에 있는 원소를 가장 많이 커버하는 Si를 반복적으로 찾아서 포함시키는 방식을 사용한다. 알고리즘 입력에 전체 집합 U와 그 부분 집합 Si들을 포함한 집합 F가 주어진..
부분 배낭 문제 (Fractional Kanpsack Problem)
·
Algorithm/알기 쉬운 알고리즘
부분 배낭 문제 (Fractional Kanpsack Problem) 배낭 문제 n개의 물건이 각 무게와 가치를 가지고 있을 때, 한정된 용량의 배낭에 최대의 가치를 갖도록 넣는 방법에 대한 문제이다. 부분 배낭 문제는 물건을 부분적으로 담는 것이 허용된다. 알고리즘 물건을 부분적으로 담을 수 있으므로, 단위 무게당 가치가 제일 높은 것부터 배낭에 넣는다. 만약 통째로 넣을 수 없다면, 넣을 수 있는 만큼만 부분적으로 넣는다. 입력으로 각 물건의 무게와 가치, 배낭의 용량을 받는다. 출력은 배낭에 담은 물건 리스트와 배낭에 담은 가치의 총합이다. Pseudo Code FractionalKnapsack(Item *arr, int capacity) { 각 물건의 단위 무게당 가치를 계산한다. 단위 무게당 가..
최단 경로 찾기(Shortest Path)
·
Algorithm/알기 쉬운 알고리즘
최단 경로 찾기(Shortest Path) 가중치 그래프의 어느 한 출발점에서 도착점까지의 최단 경로를 찾는 문제이다. 대표적으로 다익스트라 최단 경로 알고리즘이 있다. 다익스트라(Dijkstra) 최단 경로 알고리즘 프림의 최소 신장 트리(MST) 알고리즘과 비슷하다. 주어진 출발점에서부터 최단 거리인 점을 하나씩 확정해가며 각 점까지의 최단 거리를 점차 업데이트하는 방식이다. 입력으로 주어지는 그래프에는 각 점과 선분에 대한 정보가 있다고 가정한다. Pseudo Code ShortestPath(Graph g, Node start) { int dist[n]; // 최단 거리를 저장한 배열 dist[start] = 0; start를 제외한 나머지는 inf로 초기화시킨다. while (최단 거리가 확정되지..
최소 신장 트리(Minimum Spanning Tree)
·
Algorithm/알기 쉬운 알고리즘
최소 신장 트리(Minimum Spanning Tree) 가중치 그래프에서, 사이클 없이 모든 점을 연결시킨 트리들 중에 가중치 합이 최소인 트리를 의미한다. 그래프의 점의 수가 n이면, 신장트리에는 (n - 1)개의 선분이 존재한다. n개 이상의 선분이 존재할 경우 사이클이 생기고, 이는 트리라고 할 수 없다. 대표적인 그리디 알고리즘으로 크러스컬(Kruskal) 알고리즘과 프림(Prim) 알고리즘이 존재한다. 입력으로 받는 그래프 G에는 점의 집합 V와 선분 집합 E에 대한 정보가 포함되어 있다. 점의 개수를 n, 선분의 개수를 m이라고 가정한다. 크러스컬(Kruskal) 알고리즘 최소 가중치를 가진 선분을 하나씩 뽑아서, 트리에 사이클을 형성하지 않는지 검사하고 추가하는 방식이다. Pseudo Co..
SSH 접속 시 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
·
Linux/Error
SSH 접속 시 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key h..
라즈베리파이 USB 부팅
·
Raspberrypi
라즈베리파이 USB 부팅 라즈베리파이3B에서 테스트했다. USB 부트 모드를 설정해야 하므로 일단 micro sd카드에서 부팅해야 한다. USB에 라즈베리파이 OS 올리기 컴퓨터에 USB를 꽂고 아래 사이트에서 Raspberry Pi Imager를 다운받는다. https://www.raspberrypi.org/software/ 받는 동안 라즈베리파이에서 아래 설정을 변경한다. 라즈베리파이 설정 변경 USB 부트 모드를 활성화해야 한다. sudo apt update sudo apt upgrade echo program_usb_boot_mode=1 | sudo tee -a /boot/config.txt sudo reboot program_usb_boot_mode = 1 이런 식으로 띄어쓰기를 하면 적용이 되..
03. 분할 정복 알고리즘
·
Algorithm/알기 쉬운 알고리즘
알기쉬운 알고리즘(양성봉 저, 생능 출판) 책을 바탕으로 작성한 내용이다. 03. 분할 정복 알고리즘 주어진 문제의 입력을 분할하여 문제를 해결하는 방식의 알고리즘이다. 분할된 입력의 문제(부분문제, Subproblem)에 대해 동일한 알고리즘을 적용하여 부분해를 얻으며, 이를 취합해서 원래 문제의 해를 얻는다. 더 이상 분할할 수 없을 때까지 계속 부분문제로 분할한다. 문제 : 크기가 n인 입력을 3개로 분할하고, 각각 분할된 부분문제의 크기가 n/2이라고 할 때, 총 몇 번 분할하여야 더 이상 분할할 수 없는 크기인 1이 될까? 총 분할 횟수를 k라고 하면, n/2k = 1이므로 k는 log2n이 된다. 분할 정복 알고리즘의 분류 문제가 a개로 분할되고, 부분문제의 크기가 1/b로 감소하는 알고리즘 ..
최근접 점의 쌍 찾기(Closest Pair)
·
카테고리 없음
최근접 점의 쌍 찾기(Closest Pair) 2차원 평면 상의 n개의 점이 입력으로 주어질 때, 거리가 가장 가까운 한 쌍의 점을 찾는 문제 모든 점에 대하여 각각의 두 점 사이의 거리를 계산하는 방법의 시간 복잡도는 O(n2)이다. 분할 정복을 이용하면 시간 복잡도는 O(n(logn)2)이다. 책에서는 O(n(logn)2)이라고 하는데, 아직 y좌표에 대해 반드시 정렬해야 하는건지 잘 모르겠고, 찾아보니 O(nlogn)이라는 정보도 있다. https://en.wikipedia.org/wiki/Closest_pair_of_points_problem 분할 정복 알고리즘 2개나 3개의 점이 남을 때까지 분할한다. 최근접 쌍을 찾고 분할한 부분문제들을 합칠 때, 합치는 경계를 기준으로 좌우의 점들에 대해 다..
선택 문제 (Selection Problem)
·
Algorithm/알기 쉬운 알고리즘
선택 문제 (Selection Problem) n개의 숫자들 중에서 k번째로 작은 숫자를 찾는 문제이다. 간단한 해결 방법 최소인 숫자들 찾아서 제거하는 방법을 k번 반복한다. 최악의 경우 시간 복잡도 : O(kn) 오름차순으로 정렬한 뒤 k번째 숫자를 찾는다. 최악의 경우 시간 복잡도 : O(nlogn) 간단하지만 비효율적이다. 이진 탐색과 퀵 정렬을 섞으면 원하는 숫자를 효율적으로 찾을 수 있다. 데이터 분석에서 중앙값(median)을 찾는 데 활용된다. 아이디어 퀵 정렬에서 처럼 피벗을 정하고 피벗보다 작은건 왼쪽, 피벗보다 큰건 오른쪽에 위치하도록 정렬한다. 작은 그룹의 크기와 큰 그룹의 크기는 피벗의 인덱스를 통해 알 수 있다. 분할 찾고자하는 k번째로 작은 숫자가 피벗인 경우 그대로 반환한다...
퀵 정렬 (Quick Sort)
·
Algorithm/Sort
퀵 정렬 (Quick Sort) 분할 정복 알고리즘이지만 사실은 정복하고 분할한다. 입력의 크기가 클 경우 가장 좋은 성능을 보이는 정렬 알고리즘이다. 생물 정보 공학(Bioinformatics)에서 특정 유전자를 찾을 때 접미 배열(Suffix Array)와 함께 사용된다고 한다. 피벗(pivot) 숫자를 기준으로 피벗보다 작은 숫자를 왼쪽으로, 큰 숫자를 오른쪽으로 이동시킨 다음 피벗을 사이에 놓고 분할하는 방식이다. 피벗은 부분문제에 포함되지 않는다. pseudo code QuickSort(int *arr, int left, int right) { if (left < right) { 피벗을 arr[left] ~ arr[right] 중에 선택한다. 피벗을 arr[left]와 자리를 바꾼다. 피벗보다 ..
합병 정렬 (Merge Sort)
·
Algorithm/Sort
합병 정렬 (Merge Sort) 입력이 2개의 부분문제로 분할되고, 부분문제의 크기가 1/2로 감소하는 분할 정복 알고리즘 연결 리스트에 있는 데이터를 정렬할 때 퀵 정렬이나 힙 정렬보다 훨씬 효율적이라고 한다. pseudo code MergeSort(int arr[], int p, int q) { if (p < q) { int k = (p + q) / 2; MergeSort(arr, p, k); MergeSort(arr, k + 1, q); arr[p] ~ arr[k]와 arr[k + 1] ~ arr[q]를 합병한다. } } 시간 복잡도 분할하는 부분 배열의 중간 인덱스 계산과 재귀 호출 2번으로 O(1) 시간이 걸린다. 합병하는 부분 두 정렬된 배열 A, B의 크기가 각각 n과 m이고 이를 합병하여..
02. 알고리즘을 배우기 위한 준비
·
Algorithm/알기 쉬운 알고리즘
알기쉬운 알고리즘(양성봉 저, 생능 출판) 책을 바탕으로 작성한 내용이다. 02. 알고리즘을 배우기 위한 준비 2.1 알고리즘이란 유래 : 페르시아 수학자인 알콰리즈미(al-Khwarizmi)(서기 780~850년) 알고리즘은 문제를 해결하는 단계적 절차 또는 방법이다. 이는 컴퓨터로 해결할 수 있어야 하며 입력과 출력이 존재한다. 알고리즘의 일반적인 특성 정확성 주어진 입력에 대해 올바른 해를 준다. 수행성 컴퓨터에서 수행이 가능해야 한다. (애매모호한 표현이 없어야 한다.) 유한성 현실적인 시간 내로 종료되어야 한다. 효율성 시간적, 공간적인 효율성을 최대한 고려해야 한다. 2.2 최초의 알고리즘 기원전 300년경에 만들어진 유클리드(Euclid)의 최대공약수를 찾는 알고리즘이 최초이다. 유클리드의 ..