오늘 할 일 그래프 이론 구현 ex. 사칙연산 빠르게 구하기 기타(자료구조론) 그래프 이론 그래프 이론 관련 용어 숙지하기 정점(노드, Vertex)과 간선(Edge), 가중치 유향(일방향) 그래프와 무향(양방향) 그래프 ex. SNS 친구 관계 ㅋㅋㅋ 희소 그래프와 밀집 그래프, 완전 그래프 → 시간 복잡도 때문에 사용 but 중요하진 않지만 완전 그래프는 약간 중요함 ㅋㅋㅋ ex. 외판원 문제 → 완전 그래프 스택과 큐 복습! 큐 선입선출 나가는 건 처음 들어간 것 들어올땐 마지막으로 시간 복잡도상 리스트 구현 힘들다. (pop(0) → O(N) / append() → O(1)) → deque deque 자료의 선입과 선출이 중간에 이뤄지지 않고 양 끝에서 이뤄진다. from collections i..
검색어 기반 API 1. SearchController @GetMapping("/search") public List getSearchCourse(@RequestParam("keyword") String keyword) { List searchCourse = courseListService.getSearchCourse(keyword); // 각 강의 정보를 CourseSearchResponseDto로 변환하여 리스트에 추가 List responseDtoList = searchCourse.stream() .map(course -> new CourseSearchResponseDto(course.getTitle(), course.getTags(), course.getUser().getUserName())) ...
2024.04.12 (금) 오늘 할 일 2차원 리스트와 델타 탐색 2차원 리스트와 델타 탐색 1. 모듈러 연산 나머지로 깎아 버린다. ex. 0 1 2 3 0 1 2 3 … 2. 몫 연산 2차원 리스트 순회할 때 사용 matrix = [[3, 7, 9], [4, 2, 6], [8, 1, 5]] for i in range(9): print(matrix[i // 3][i % 3]) #쓸 일 많이 없다 그냥 이중 for 문 돌리자 3. 델타 탐색 기법 상하좌우 움직이는 구현 “delta” (작은 값) → 알고리즘에서는 이차원 리스트의 한 칸 new_r -> nr new_c -> nc nr = r + dr nc = c + dc [상] -> dr : -1 /. dc : +0 [우] -> dr : +0 /. dc ..
2024.04.11 (목) 오늘 할 일 String 알고리즘 투포인터 같은 단위 내에서 시간복잡도 감소 (3N → 2N) 투포인터 시간 복잡도를 줄인다. 양쪽 데이터를 봐야할 때 word = input('단어를 입력하세요: ') left = 0 # 시작 인덱스 right = len(word)-1 # 마지막 인덱스 is_palindrome = True while left < right: # 왼쪽과 오른쪽이 유지될때까지 돌아라! if word[left] == word[right]: # 같은 경우라면 아직은 회문 조건을 만족함 left += 1 # 왼쪽 포인터를 한칸 오른쪽으로 증가시키고 right -= 1 # 오른쪽 포인터를 한 칸 왼쪽으로 감소 continue else: # 다른 경우라면 그 즉시 안된다고..
2024.04.09 (화) 정렬 목표 : 안정 정렬이 무엇인지! 버블 정렬 (안정 정렬) # 버블 정렬 코드 arr = [2, 4, 1, 3] # 정렬하고자 하는 리스트의 길이가 4니까? for i in range(len(arr)-1, 0, -1): # 총 3회 시행, for j in range(i): # 각 시행 횟수 안에서, 3 2 1 번씩 비교 할것 if arr[j] > arr[j+1]: # 내가 오른쪽 녀석보다 크다면? arr[j], arr[j+1] = arr[j+1], arr[j] # 자리를 바꾼다! print(arr) ''' " > " 때문에 안정 정렬이 된다!! ''' 2. 카운팅 정렬 (안정 정렬) 어렵… 안정 정렬 보장법 기교 S 배열 (누적합 배열) step 1. 개수를 센다. step..
2024.04.05 (금) 오늘 배울 것 함수, 스코프 재귀함수 log N 시간 복잡도 이분 탐색기 함수, 스코프 이름 공간 a = 3 def func(): a = 4 print(a) func() print(a) #4 #3 ''' !!!!순서 중요!!!! Local : ex. a = 4 의 a Enclosed (함수 안의 함수) Global : ex. a = 3 의 a / func Built-in : print, sum... ''' a = 3 def func(): global a a = 4 print(a) func() print(a) #4 #4 스코프 → 함수 기준 a = [1, 2, 3] print(id(a)) def func(lst): print(id(lst)) lst.append(4) print(l..

2024.04.04 (목) 슬라이싱 하나씩 보는 것을 순차검색 shallow copy (얕은 복사) 기능 이차원 리스트 복사하는 것 주의!! 제일 밖에 껍데기만 갈아끼우고 안쪽 리스트는 계속 연동 #해결 방법 #첫 번째 방법 a = [[1, 2], [3, 4]] b = [] for i in a: b.append(i[:]) print(b) #두 번째 방법 -> 자주 사용한다. a = [[1, 2], [3, 4]] b = [i[:] for i in a] print(b) #세 번째 방법 -> 삼차원 이상이면 deepcopy 사용이 좋다. import copy a = [[1, 2], [3, 4]] b = [i[:] for i in a] c = copy.deepcopy(a) print(b) 슬라이싱 삽입 → 따로..
2024.04.02 (화) 다익스트라 → 벨만 포드 알고리즘 이런이런 상황이거든? 자료구조! 그걸 토대로 풀어내는게 알고리즘! 리팩토링? 소프트웨어 공학에서 '결과의 변경 없이 코드의 구조를 재조정함'을 뜻한다. 주로 가독성을 높이고 유지보수를 편하게 한다. 버그를 없애거나 새로운 기능을 추가하는 행위는 아니다. 알고리즘 공부 방법론 실전형 : 일단 문제를 풀면서 내용을 공부 틀려도 답지보고 풀고 비슷한 유형을 더 풀어본다. 탐구형 : 우선 이론을 공부. 이후 이론에 맞는 문제를 풀되, 안 풀리는 문제를 끝까지 고민해보며 최대한 생각을 많이 해본다. 실전형으로 하자!!!!!!!!!! BOJ 실버 ~ 골드, 프로그래머스 LV 2~3 대략 200 ~ 300 Q 정도면 1회독 결국 중요한 것은 얼마나 꾸준히 ..