알고리즘(35)
-
Python 54 - 숫자 카드 게임( 알고리즘 )
숫자 카드 게임은 여러 개의 숫자 카드 중에서 가장 높은 숫자가 쓰인 카드 한 장을 뽑는 게임이다. 단, 게임의 룰을 지키며 카드를 뽑아야 하고 룰은 다음과 같다. 숫자가 쓰인 카드들이 N x M 형태로 놓여 있다. 이떄 N은 행의 개수를 의미하며, M은 열의 개수를 의미한다. 먼저 뽑고자하는 카드가 포함되어 있는 행을 선택한다. 그 다음 선택된 행에 포함된 카드들 중 가장 숫자가 낮은 카드를 뽑아야 한다. 따라서 처음에 카드를 골라낼 행을 선택할 때, 이후에 해당 행에서 가장 숫자가 낮은 카드를 뽑을 것을 고려하여 최종적으로 가장 높은 숫자의 카드를 뽑을 수 있도록 전략을 세워야 한다. 예를 들어 3 x 3 형태로 카드들이 다음과 같이 놓여 있다고 가정하자. 여기서 카드를 골라낼 행을 고를 때 첫 번째..
2021.06.15 -
Python 53 - 큰 수의 법칙( 알고리즘 )
'큰 수의 법칙' 은 일반적으로 통계 분야에서 다루어지는 내용이지만 글쓴이는 본인만의 방식으로 다르게 사용하고 있다. 글쓴이의 큰 수의 법칙은 다양한 수로 이루어진 배열이 있을 때 주어진 수들을 M번 더하여 가장 큰 수를 만드는 법칙이다. 단, 배열의 특정한 인덱스(번호)에 해당하는 수가 연속해서 K번을 초과하여 더해질 수 없는 것이 이 법칙의 특징이다. 예를 들어 순서대로 2, 4, 5, 4, 6 으로 이루어진 배열이 있을 때 M이 8이고, K가 3이라고 가정하자. 이 경우 특정한 인덱스의 수가 연속해서 세번까지만 더해질 수 있으므로 큰 수의 법칙에 따른 결과는 6 + 6 + 6 + 5 + 6 + 6 + 6 + 5 인 46이 된다. 단, 서로 다른 인덱스에 해당하는 수가 같은 경우에도 서로 다른 것으로..
2021.06.14 -
Python 52 - 당장 좋은 것만 선택하는 그리디 ( 알고리즘 )
그리디(Greedy) 알고리즘은 단순하지만 강력한 문제 해결 방법이다. 이 알고리즘 유형은 국내 알고리즘 교재에서 단어그대로 번역하여 '탐욕법' 으로 소개된다. 이름에서 알 수 있듯이 어떠한 문제가 있을 때 단순 무식하게, 탐욕적으로 문제를 푸는 알고리즘이다. 여기서 탐욕적이라는 말은 '현재 상황에서 지금 당장 좋은 것만 고르는 방법'을 의미한다. 그리디 알고리즘을 이용하면 매 순간 가장 좋아보이는 것을 선택하며, 현재의 선택이 나중에 미칠 영향에 대해서는 고려하지 않는다. 그리디 알고리즘 유형의 문제는 매우 다양하기 때문에 암기한다고 해서 항상 잘 풀 수 있는 알고리즘 유형이 아니다. 사전 지식 없이도 풀 수 있는 문제 도 있겠지만, 많은 유형을 접해보고 문제를 풀어보며 훈련해야 한다. 그리디 알고리즘..
2021.06.13 -
Python 51 - 시간복잡도, 공간복잡도, 빅오표기법 ( 알고리즘 공부 )
목차 1. 시간복잡도 2. 공간복잡도 3. 시간과 메모리 측정 개요 복잡도는 알고리즘의 성능을 나타내는 척도이다. 복잡도는 시간 복잡도와 공간 복잡도로 나눌 수 있다. 쉽게 말하면 시간 복잡도는 특정한 크기의 입력에 대하여 알고리즘이 얼마나 오래 걸리는지를 의미하고, 공간 복잡도는 특정한 크기의 입력에 대하여 알고리즘이 얼마나 많은 메모리를 차지하는지를 의미한다. 복잡도를 측정함으로써 다음과 같은 2가지를 계산할 수 있다. 시간 복잡도 : 알고리즘을 위해 필요한 연산의 횟수 공간 복잡도 : 알고리즘을 위해 필요한 메모리의 양 1. 시간 복잡도 알고리즘 문제를 풀 때 단순히 ‘복잡도’라고 하면 보통은 시간 복잡도를 의미한다. 시간 복잡도를 표현할 때는 빅오 표기법을 사용한다. 빅오 표기법을 간단히 정의하자..
2021.06.12 -
Python 50 - 재귀 호출 / 스택(stack) / 유클리드 호제법
재귀 호출 1. 자기 자신을 다시 호출하는 기능 2. 함수 안에서 자신의 함수를 호출하는 기능 3. 반복문 + stack 구조 (뒤로가기, undo, ctrl+z) def sum(n): if n == 0: return 0 return sum(n-1)+n # sum(n-1)에 대한 값은 모르니까 stack에 쌓아놓는다. print(sum(5)) 출력값 : 15 돌아가는 방식(stack이 쌓이는 모습) print(sum(1)) -----> 1 1이 아래로 넘어감 print(sum(2)) -----> 1 + 2 3이 아래로 넘어감 print(sum(3)) -----> 3 + 3 6이 아래로 넘어감 print(sum(4)) -----> 6 + 4 10이 아래로 넘어감 print(sum(5)) -----> 10 ..
2021.06.11