목록전체 글 (106)
훈훈훈
이번에는 탐색 문제 유형 중 하나인 봉우리 개수 찾는 문제에 대하여 정리를 해보려고 한다, 문제는 다음과 같다. > N*N 격자판이 주어지고, 각각의 격자에는 높이가 들어가 있다. 각 격자를 기준으로 상하좌우를 비교했을 때 가장 큰 높이가 봉우리일 때, 봉우리 개수를 구하라. (단 격자판의 가장자리는 모두 0으로 초기화 한다.) # 접근 방법 위 그림과은 3*3 행렬이 주어진 후, 격자판 가장자리를 0으로 초기화 했을때의 그림이다. 2차원 배열을 탐색하는 문제이기 때문에 이중 for문으로 2차원 배열을 탐색한다. 배열의 각 요소를 탐색하면서 상하좌우로 크기 비교를 진행한다. 만약 matrix[i][j] 를 탐색한다고 했을때, matrix[i+1][j] matrix[i-1][j] matrix[i][j+1]..
이번에는 탐색 유령 중 하나인 너무 유명한 괄호 문제에 대하여 정리해보려고 한다. 문제는 다음과 같다. > 괄호로 이루어진 문자열이 주어지고, 짝이 맞으면 YES, 틀리면 NO를 반환, (단, 문자열의 길이는 6으로 가정한다.) # 접근 방법 접근 방법은 위 그림과 같다. 먼저 주어진 문자열의 처음 길이를 저장 후, 반복문을 돌려 짝이 맞는 괄호를 발견하면 공백으로 제거해주는 작업을 반복한다. 그 다음 처음 문자열 길이와 나중 문자열 길이를 비교 후 YES, NO를 판별한다. # 풀이 def check_func(values): answer = [] str_list = ['[]', '{}', '()'] # 인자로 받은 문자열로 이루어진 리스트 탐색 for element in values: first = 0..
이번에는 Django-mptt에 대하여 정리해보려고 한다. 해당 모듈을 사용하게된 계기는 ERD 설계 시, Categorya 항목들에 대하여 계층형으로 구성하기 위해 사용하게 되었다. 카테고리 항목들을 계층형으로 작성하는 이유는 다음과 같다. 만약 카테고리가 main, sub 두 가지로 구성이 되어 있다고 가정해보자, 이렇게 구축된 환경에서 category가 1개 2개 3개 늘어날 때마다 각각 독립적인 관계가 아니기 때문에 구조가 점점 복잡해지게 된다. 하지만 계층형으로 설계시 아래와 같이 만들 수 있으며, 확장에 용이하다. # 카테고리 예시 # 예제 코드 from mptt.models import MPTTModel, TreeForeignKey class Category(MPTTModel): name =..
이번에는 Django를 사용하여 crontab을 사용하는 방법에 대하여 정리하려고 한다. crontab을 사용하게된 계기는 매 특정 주기마다 가격이 변동시키고 싶어서 적용해보게 되었다. 이제 Django에서 crontab을 사용하는 방법에 대하여 알아보자 # 모듈 설치 pip install django-crontab 먼저 pip로 "django-crontab" 모듈을 설치하자 설치가 되면 아래와 같이 settings.py에 INSTALLED_APPS에 추가해주면 사용할 수 있다. # settings.py INSTALLED_APPS = [ 'django_crontab', ] # 매 3시간 마다 cron.py 실행 CRONJOBS = [ ('0 */3 * * *', 'my_cron.schedule_03hr_..
이번에는 Selected_related와 Prefetch_related에 대해 정리 해보려고 한다. Django ORM으로 DB에 쿼리 시 get, filter, all 이외에 Selected_related와 Prefetch_related를 적절히 사용하면 아주 강력한 무기가 될 수 있다. 이제 Selected_related와 Prefetch_related가 무엇인지 알아보도록 하자. Selected related # Selected_related 란 ? Selected_related는 SQL Query 문의 JOIN 을 사용하여 foreign-key(one to one, many to one)를 사용하여 정참조할 때 사용하며 QuerySet을 가져올 때, 미리 related objects까지 불러오는 ..
이번에는 알고리즘 유형 중 하나인 큐 유형에 대하여 정리 해보려고 한다. 문제 유형으로는 숫자로 이루어진 문자열과 임의의 숫자 m을 입력 받은 후 문자열에서 1부터 m 까지 카운트 하며, 차례대로 배열 뒤로 배치 후, m번째 있는 숫자를 제거하는 과정을 반복 수행하여 최종적으로 남은 숫자를 반환하는 문제이다. 아래 그림은 1 부터 8까지 숫자들을 정렬 후, 3번째에 위치한 숫자들을 차례대로 제거하는 로직이다. # 풀이 과정 큐는 자료구조는 FIFO(First in First out) 구조를 가지고 있기 때문에 리스트의 가장 앞에 있는 인덱스 부터 제거하는 해당 문제 유형에서 적용하기 알맞다. 파이썬에서는 deque라는 모듈을 지원하기 때문에 리스트 앞에 있는 인덱스를 제거할때는 popleft( ) 모듈을..
이번에는 알고리즘 유형 중 하나인 스택에 대해 정리 해보려고 한다. 문제 유형으로는 숫자로 이루어진 문자열에서 m개의 숫자를 제거할때 가장 큰 수를 출력하는 문제를 선택하였다. # 풀이 과정 입력 받은 m개의 숫자 만큼 반복문을 돌리면서 제거할 숫자를 탐색해야 한다. 탐색하기 위한 가장 좋은 방법은 아래와 같이 "7' 이라는 숫자를 예를 들어 설명하자면, 7 앞에 있는 4와 2는 7 보다 작은 숫자 이기 때문에 제거할 수 있다. 즉, 연속된 두 인덱스의 숫자를 비교하여 크면 stack에 담고 작으면 pop 시킬 수 있다. 이러한 과정을 m번 만큼 반복한 후 최종 stack을 return 시키면 된다. 위 과정대로 m번 만큼 반복이 되어서 깔끔하게 정답이 나올 수 있지만, 예외적으로 리스트의 길이 만큼 탐..
이번에는 알고리즘 유형 중 이분 검색에 대해 정리하려고 한다. 문제 유형으로는 숫자로 이루어진 문자열을 Input으로 받은 후 오름차순으로 정렬하여 특정 숫자의 인덱스 값을 반환하는 문제이다. # 풀이 과정 먼저 입력받은 문자열을 sort 메서드로 오름차순으로 정렬한다. 그 다음 아래 그림과 같이 첫 인덱스를 Left 그리고 마지막 인덱스에 Right를 설정한다. 그리고 Left와 Right의 평균 값을 Middle로 설정한다. 그 후 Middle 값이 찾고자 하는 숫자와 같은지 비교 후 같으면 Middle 값의 인덱스를 리턴하고, 그게 아니라면 Middle과 크기 비교 후 Middle이 크면 Left = Middle + 1 로 설정하고 그게 아니라면 Right = Middle -1 로 설정한다. 그리고..