목록이론 (20)
책 읽다가 코딩하다 죽을래
재귀 함수는 함수 안에 자기를 다시 호출하는 함수이다. 알고리즘 문제 중 어떤 패턴이 반복적으로 나오거나, 같은 문제를 여러 번 풀어야 하는 상황이 생길 때 쓰이는 방법이다. 재귀 함수를 만드는 방법은 간단하다. def infinity: print("재귀함수가 뭐냐면은...") infinity() 함수 안에 다시 자신의 함수를 호출하면 된다. 근데 위의 예시는 계속 자신의 함수를 무한정 호출하게 되므로 스택오버플로우 오류가 일어난다. def function(k): if k
이런 배열이 있고 나는 'mango'라는 단어가 이 배열에 있는지 탐색한다고 가정하자 배열에 어느 특정 값을 찾으려면 당연히 처음부터 끝까지 하나씩 하나씩 찾아봐야 한다. 마치 배열 요소 닫힌 박스라고 생각하고 거기서 망고가 들어있는 박스를 찾으려면 하나하나씩 일일이 다 열어봐야 한다. 우린 이렇게 처음부터 순차적으로 데이터를 찾아보는 것을 순차 탐색이라 부른다. 여기서 운이 좋게도 한 번에 그 박스를 찾으면 행복하겠지만 맨 마지막에 그 박스를 찾으면 나는 운이 더럽게도 없다며 생각할 것이다. 여기서 순차 탐색의 시간복잡도를 알 수 있다. 찾고자 하는 데이터가 배열의 맨 앞에 있다면 시간 복잡도는 O(1)이지만 맨 뒤에 있었다면 시간복잡도는 O(N)이 걸릴 것이다. 즉 배열의 크기가 클수록 더 많은 시간..
자료구조 중에서 자주 쓰이는 Array와 LInkedList를 서로 비교하겠다. 언어는 Python 기준으로 하겠다. (선언할 때 배열 크기를 정해야 하는 c++, 자바의 정적 배열과는 달리 Python의 배열은 동적 배열이다.) 다음 간단한 배열의 예를 들어보자 배열은 index와 데이터로 이루어져있다. index는 0으로부터 시작되어 데이터의 순서를 매기며 데이터는 int형부터 시작되어 그 어떤 데이터 타입도 들어갈 수 있다. 여기서 배열의 어떤 하나의 데이터에 접근하는데 걸리는 시간은 얼마나 소요될까? 정확히 말하자면 시간복잡도 O는 얼마일까? 답은 O(1)이다. 내가 접근하고 싶은 데이터가 배열의 맨 앞에 있는 뒤에 있든 중간에 있는 ary[0], ary[2], ary[4] 이런 식으로 단 한 번..
1. 시간복잡도 더보기 시간 복잡도는 입력값에 따라 문제를 해결하는데 걸리는 시간과의 상관관계를 말합니다. 똑같은 알고리즘에 입력값이 몇 배로 늘어남에 따라 문제를 해결하는 데 걸리는 시간은 몇 배만큼 늘어나는지 보는 것이다. 우리는 똑같은 입력값이라도 당연히 더 빠른 시간 안에 입력을 처리하는 알고리즘을 선호한다. 즉 걸리는 시간이 줄어들수록 시간 복잡도는 작아지며, 시간 복잡도가 작은 알고리즘이 좋은 알고리즘이다. 시간 복잡도에 대해서 설명하기 위해 똑같은 목적을 가진 두 개의 알고리즘을 살펴보겠다. 두 개의 알고리즘의 목표는 배열 안에 숫자 중 가장 큰 최댓값을 찾는 로직이다. array = [1,3,6,5,4,2] def findMaxValue(array): max_num = array[0] fo..