플러드 필 알고리즘 flood fill 혹은 seed fill이라고 불리는 알고리즘이다. 다차원 배열에서 어떤 칸과 연결된 영역을 찾는 알고리즘이며, 채우기 도구나 지뢰 찾기 게임에서 사용된다. 일반적으로 시작 칸을 중심으로 상하좌우로 연결 된 모든 칸을 방문하여 색을 칠하는 구조이다. 여러가지 구현 방법이 있지만, 큐나 스택의 자료구조를 사용하는 것이 일반적이다. 4방향과 8방향으로 구분되며, 알고리즘 문제에서는 주로 4방향 문제를 주어진다. (8 방향의 경우, 상하좌우 + 대각선을 탐색한다) 모든 정점에서 dfs나 bfs 탐색을 통해 연결요소가 몇개인지 파악할 수 있다. 구현 https://school.programmers.co.kr/learn/courses/30/lessons/154540 프로그래머..
Swagger 프로젝트 내에 여러 API를 한번에 문서화하여 볼 수 있게하는 패키지이다. API 관리에 매우 용이하며, 앱에 적용하기 전에 테스팅을 할 수 있다. 장고에서 Swagger를 활용하여 Rest API Document를 생성하는 방법을 배우고 프로젝트에 적용시켰다. 라이브러리 장고에서 swagger를 사용하기 위해서 drf-yasg, djangorestframework를 설치해야 한다. drf-yasg는 장고로 정의 된 API를 문서화할 수 있는 패키지로 DRF - Yet Anoter Swagger Generator의 약자이다. 라이브러리를 설치해서 swagger 사용 환경을 세팅한다. pip install drf-yasg pip install djangorestframework 가상 환경에서..
에라토스테네스의 체 소수를 찾을 때 가장 적은 시간 복잡도를 소요하는 알고리즘이다. 여러 개의 수가 소수인지 아닌지를 판별하며, N보다 작거나 같은 모든 소수를 찾을 때 사용할 수 있다. 에라토스테네스보다 시간 복잡도가 높은 알고리즘과 비교하여 해당 알고리즘의 이점을 파악한다. 일반적인 소수 찾기 알고리즘 소수의 판별법을 사용한다. 소수란 2보다 큰 자연수 중에서 1과 자기 자신을 제외한 자연수로는 나누어 떨어지지 않는 자연수이다. 6의 경우 1,2,3,5을 약수를 가지므로 소수가 아니고, 7의 경우 1,7만을 약수로 가지므로 소수라고 할 수 있다. 가장 간단한 소수 판별법은 아래와 같으며, 어떤 수의 소수를 찾을 때 시간 복잡도가 O(n)이 된다. # 가장 간단한 소수 판별법 # 모든 수를 나누어서 소..
[공부기록] python으로 코딩하다가 연산자 '/'와 '//'의 차이를 알 필요가 있었다. 우선 연산자 '/'와 '//'의 차이는 반환하는 자료형이다. / 는 나눗셈의 결과가 float로 반환된다. // 는 나눗셈의 결과가 int로 반환된다. 예제로 4가지 경우에 대하여 출력했다. print(type(5/2)) print(type(4/2)) print(type(5//2)) print(type(4//2)) 결과는 아래와 같다. / 연산자인 경우 결과가 정수인 경우에도 float로 출력된다. // 연산자인 경우 결과가 소수인 경우에도 int로 출력된다. 값을 출력해봤다. print((5/2)) print((4/2)) print((5//2)) print((4//2)) ..
DRF를 사용하기 위해서는 DRF의 동작 방식을 알아야 했다. DRF에서는 model - serializer - view - url 순으로 구현해야 한다. 개인 프로젝트를 진행하면서 작성한 코드로 해당 방식에 대한 동작을 살펴보겠다. user App 내에서 구현하였다. [model 구현] 모델은 데이터이다. class searchLog(models.Model): username = models.ForeignKey(Profile,on_delete=models.CASCADE,related_name='searchLogPost',to_field='username_id') log = models.CharField(max_length=50,db_column='log') model에서 serchLog라는 class를..
Django , DRF를 사용하다 보면 현재 시간을 데이터로 저장해야 할 때가 있다. DateTimeField 를 사용하면 되는데, auto_now 속성과 auto_now_add 속성을 구분해서 사용해야 한다. 인스타그램 클론코딩 개발중에 사용자가 올린 스토리의 시간을 기록할 필요가 있었다. #스토리 class Story(models.Model): storyId = models.BigAutoField(primary_key=True, help_text="Story ID") username = models.ForeignKey(Profile,on_delete=models.CASCADE,related_name='storyPost',db_column='username',to_field='username_id') ..