전체 글 110

동적 계획법과 분할 정복

동적 계획법과 분할 정복 동적계획법 (DP 라고 부름) 입력 크기가 작은 부분 문제들을 해결 한 후, 해당 부분 문제의 해를 활용해서 큰 크기의 부분 문제를 해결하므로써 전체 문제를 해결하는 알고리즘 동적 계획법 상향식 접근법 : 가장 최하위 해답을 구한 후 저장하고, 해당 결과값을 이용해서 상위 문제를 풀어가는 방식 Memoization 기법 사용 이전에 계산한 값을 저장해 다시 계산하지 않도록 하여 전체 실행 속도를 빠르게 하는 기술 문제를 잘게 쪼갤 때, 부분 문제는 중복되어 재활용됨 피보나치 수열 분할 정복 문제를 나눌수 없을 때까지 나누어서 각각 풀고 병합하여 문제의 답을 얻는 알고리즘 하향식 접근법 : 일반적으로 재귀함수로 구현 문제를 잘게 쪼갤 때, 부분 문제는 서로 중복되지 않음 병합 정렬..

코테/알고리즘 2023.08.30

순수 라이브러리 사용

순수 라이브러리 사용 memory-v1.jar 라이브러리를 project-v1 에 적용 라이브러리 추가 project-v1/libs 폴더 생성 후 memory-v1.jar 복사&붙여넣기 project-v1/build.gradle 에 memory-v1.jar 추가 project-v1/libs 폴더 생성 후 memory-v1.jar 복사&붙여넣기 project-v1/build.gradle 에 memory-v1.jar 추가 후 Reload 라이브러리 설정 추가한 라이브러리를 스프링 빈으로 등록해 동작하도록 해야함 스프링 부트 자동 구성을 사용하지 않았기에 빈을 직접 등록함 실행 서버 실행 라이브러리 내부에 있는 어떤 빈을 등록해야하는지 알아야하고, 직접 등록해야함 복잡한 라이브러리였다면 상당히 힘들 것으로 예..

삽입 정렬

삽입 정렬 두 번째 인덱스부터 시작 해당 인덱스 (key 값) 앞에 있는 데이터 (B)부터 비교해서 값이 작으면, B 값을 뒤 인덱스로 복사 key 값이 더 큰 데이터를 만날때까지 반복, 그리고 큰 데이터를 만난 위치 바로 뒤에 key 값을 이동 데이터가 두 개일 때 삽입 정렬 import java.util.*; ArrayList list = new ArrayList(); list.add(5); list.add(2); if(list.get(1) < list.get(0)) { Collections.swap(list, 1, 0); } System.out.println(list); // [2, 5] 데이터가 세 개일 때 삽입 정렬 import java.util.*; ArrayList list = new Arr..

코테/알고리즘 2023.08.29

선택 정렬

선택 정렬 주어진 데이터 중 최소값을 찾음 해당 최소값을 맨 앞과 교체 맨 앞을 제외한 나머지 데이터를 동일 한 방법으로 교체 데이터가 두 개일 때 선택 정렬 import java.util.*; ArrayList list = new ArrayList(); list.add(8); list.add(2); if(list.get(0) > list.get(1)) { Collections.swap(list, 0, 1); } System.out.println(list); // [2, 8] 데이터가 세 개일 때 선택 정렬 import java.util.*; ArrayList list = new ArrayList(); list.add(10); list.add(2); list.add(8); // 작은 데이터 int min..

코테/알고리즘 2023.08.29

버블 정렬

버블 정렬 인접한 데이터를 비교해서 앞에 있는 데이터가 뒤에 있는 데이터보다 크면, 자리를 바꾸는 정렬 알고리즘 데이터가 두 개일 때 버블 정렬 import java.util*; ArrayList list = new ArrayList(); list.add(5); list.add(3); if(list.get(0) > list.get(1)) { Collections.swap(list, 0, 1); } System.out.println(list); // [3, 5] 데이터가 세 개일 때 버블 정렬 import java.util.*; ArrayList list = new ArrayList(); list.add(10); list.add(3); list.add(5); for(int i = 0; i < list.si..

코테/알고리즘 2023.08.29

자동 구성 (Auto Configuration) - 2

@Contitional 특정 상황일 때만 특정 빈들을 등록해서 사용하도록 도와주는 기능 스프링 부트 자동 구성에서 자주 사용됨 matches() 메서드 : true ➡️ 동작 o / false ➡️ 동작 x ConditionContext : 스프링 컨테이너, 환경 정보 AnnotatedTypeMetadata : 어노테이션 메타 정보 Condition 인터페이스를 구현해 자바시스템 속성이 'memory=on' 이라고 되어 있을때 메모리기능이 동작 하도록 구현 MemoryCondition "on" 일 경우 true 반환 MemoryConfig @Conditional 어노테이션 추가 (MemoryCondition.class 부터 먼저 체크함) 인텔리제이 VM 속성 설정 -Dmemory=on / -D 꼭 붙여줘..

공간 복잡도

알고리즘 계산 복잡도는 두가지로 나뉘어짐 시간 복잡도 공간 복잡도 둘다 만족시키기는 어려움 시간과 공간은 반비례적 경향 대용량 시스템 보편화로 시간 복잡도가 우선 공간 복잡도 프로그램 실행/완료 시 필요한 저장 공간 총 필요 저장 공간 고정 공간 (알고리즘과 무관한 공간) : 코드 저장 공간, 단순 변수 및 상수 가변 공간 (알고리즘 실행과 관련있는 공간) : 실행 중 동적으로 필요한 공간 𝑆(𝑃)=𝑐+𝑆𝑝(𝑛) / c: 고정 공간, 𝑆𝑝(𝑛) : 가변 공간 공간 복잡도는 가변 공간에 좌우됨 공간 복잡도 계산 공간 복잡도 계산은 알고리즘에서 실제 사용되는 저장 공간을 계산하면 됨 예제 1 n! 구하기 n! = 1 * 2 * 3 * ... * n 공간 복잡도는 O(n) / 실행시 사용되는 저장공간을 계산하..

코테/알고리즘 2023.08.23

힙 (Heap)

힙 (Heap) 힙 (Heap) : 최대값과 최소값을 바르게 찾기 위해 고안된 완전 이진 트리 (Complete Binary Tree) 힙 (Heap) 사용 이유 배열로 최소/최대를 찾으려면 O(n) 으로 걸림 힙 (Heap) 으로 최소/최대를 찾으면 O(logn) 으로 걸림 우선순위 큐와 같이 최소/최대값을 빠르게 찾아야하는 자료구조 및 알고리즘 구현에 활용됨 구조 최소값을 구하는 힙 (최소 힙, Min Heap) 과 최대값을 구하는 힙 (최대 힙, Max Heap) 으로 분류 힙은 아래 조건을 가지고 있는 자료구조 최대 힙 경우 각 노드의 값이 자식 노드가 가진 값보다 크거나 같음 최소 힙 경우 각 노드의 값이 자식 노드가 가진 값보다 크거나 작음 완전 이진 트리 형태 힙 데이터 삽입 - 기본 힙은 ..

코테/자료구조 2023.08.23