일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- JPA스터디
- 스프링공부
- 자료구조공부
- JPA예제
- JPA 공부
- 코테공부
- nestjs공부
- Kafka
- JPA공부
- 알고리즘공부
- Flutter
- 기술면접공부
- DDD
- 카프카
- 기술공부
- JPA
- 스프링 공부
- nestjs
- 플러터 공부
- 플러터 개발
- querydsl
- 스프링부트
- K8S
- 프로그래머스
- 스프링
- 스프링부트공부
- Axon framework
- nestjs스터디
- 코테준비
- 자바공부
- Today
- Total
목록Algorithm (84)
DevBoi
버블 정렬은 앞에서 부터 1번째와 두번째 두개를 비교해서, 특정 조건에 맞춰서 자리를 바꿔주는 것이다. 이중 for문을 돌려서, 체크를 하고, 두번째 반복문에서는, 제일 마지막에쌓인 데이터는 다시 처리하지 않는다.(처리해도 무방하긴 하다, 다만 낭비가 심하니까, 해당 작업은 하지않는다.) 특수하게 짜는 경우는 내부 반복분에 boolean flag를 두어서, 한번돌았을때, 정렬을 한번 도 하지 않는 경우 즉 swap 이 일어나지 않는 경우는 그냥 끝낸다. 왜냐면, 낭비를 줄이기 위해서....그렇게 하기 이해서는 flag를 내부 반복문 안으로 넣는다. 1. 이중 반복문 (내부 반복문 도는 횟수 max값 -1 씩 감소) 2. 자리바꿈시 flag true , 아니면 break 3. 두개 바꿔야 하면 collec..
힙에 대한 알고리즘 공부를 해보자. 힙은 heap이라고 해서, 다른 의미로 생각할 수 있지만, 쉽게 말하면 단순히 완전 이진 탐색 트리이다. 완전 이진 트리라고 생각하면 된다. 특징으로는 아래와 같다. - 하위의 자식 노드는 무조건 2개가 있다. - 왼쪽이 작거나 오른쪽이 크거나 할 것없이, 단순히 부모가 자식보다 큰게 다이다. - 0의 index는 비워두고 1부터 계산한다. 해당 이유는, 부모는 자식노드 /2 , 오른쪽 은 /2+1 이런식으로 간단하게 구하기 위해서이다. - 최대힙, 최소힙이 존재하여, 데이터를 탐색하는용도 보다 최대값 최소값을 빠르게 찾기 위해서 사용한다. 우선 힙과, 힙에 데이터를 넣는 메소드를 재구현 해보자 데이터를 넣을때, 항상 넣은 데이터와 부모의 데이터를 비교해서, 두개의 s..
트리는 제약 조건이 하나만 있는 간단한 구조이다. 1. 싸이클의 형태를 띄우지 않는다. 이진트리(Binary Search Tree)는 해당 제약 조건에서 2개의 제약 조건이 더 붙는다. 1. 노드의 브랜치는 2개로 제약된다. 2. 노드의 왼쪽은 자신보다 작은 값, 오른쪽은 큰 값을 가지고있는다. import java.util.*; public class Main { public static void main(String[] args) { NodeMgmt mgmt = new NodeMgmt(); mgmt.insertValue(14); mgmt.insertValue(12); mgmt.insertValue(13); mgmt.insertValue(16); mgmt.showAllNodes(mgmt.head); }..
Hash 관련되서, 공부를 해보자, hash는 잘알다 싶이, key-value 로 이루어져 저장하는 구조이다. key를 기반으로 address를 찾아, value를 저장한다. 이를 그냥 저장 할수도 있지만 어떻게 하면 좀 더 잘 이해할수 있을 까 방법은 내가 직접 hash를 구현 해보는 방식이다. Hash는 Key기준으로 별도 address를 가져온다. 따라서 이 key에 해당 하는 address주소가 어떤 값일지 모르기 떄문에 사용하는 량보다 많은 양의 크기를 가지고 있을 수 밖에 없다. key 기준으로 단순히 value 에 값을 넣는 것은 중복 문제를 가질수 있다. 완벽하게 key기준으로 address를 가져오는 함수를 짜면 문제가 안생기겠지만, 그러기는 사실상 어렵다, 따라서 chaining 기법을..
링크드 리스트란, 객체 (흔히 노드라고 표현한다) 현재 자신의 데이터와 다음 노드를 가지고 있는 리스트이다. 처음에 시작점을 알아야 쭉 탐색이 가능하며, 중간에 수정이 들어갈때 불편하고, 탐색을 하려면 처음 head로 시작해서 재귀로, 탐색을 이어 나가야 한다. 쉽게 구현해보면 아래와 같다. 이렇게 재귀를 통해서, 해당 노드에 대한 탐색을 할수있다. 노드는 이렇게 제네릭 타입으로 선언해서, 사용할수 있다. 그러면, 추가와 전체 노드 프린트하는 함수도 구해보자 전체적인 구조를 바꿔야 한다. 전체 링크드 리스트라는 구조 속에 노드들을 넣어야 하기 때문에, class 안에 class를 넣어야 한다. 우선 add함수를 구현해봤다. 제네릭 타입으로 변경했기 때문에, 해당 제네릭 타입으로 add를 했을 경우를 가정..
큐는 배열이나 다른 것과 달리, 일반적인 입력순서가 출력순서에 영향을 주는 자료구조중에 하나이다. FIFO이라고도하고, 줄서기와 같다고도 하고, 무튼 첫번째로 입력된게 첫번째로 출력이 된다. add or offer로 값을 넣고, poll() 로 해당 리스트의 원소를 출력한다. 추가로, 해당 list를 그냥 출력하게 되면, 리스트의 모든 원소들이 출력이 된다. poll()을 하게 되면,해당 원소의 값을 가질수있게 return 이 되지만 해당 원소를 삭제 하고자 하면(순서는 poll과 동일) 아래와 같이 remove를 사용하면 된다. 이런 queue를 내가 별도로 제네릭 타입을 선언해서, add, poll 기능을 하는 것을 만든다고 해보자 아래와 같이 해당을 구현할수 있다. 자, 이제 그러면 예제를 풀어보자
배열, 단순하게는 인덱스로 관리를 하고, 처음에 크기를 설정한다. 배열 관련 알고리즘문제는 너무도 많이 나오기 때문에, 자세한 설명은 생략 1.Arrays 관련 기능 - Arrays.toString(배열); -> 배열의 값을 String으로 출력해준다. - arr1[1].indexOf("hi") -> hi or hi 말고 알파벳 하나일 경우, 해당 문자가 포함된 인덱스를 return 해준다. ex. arr1[1] ="abcd" 1)arr1[1].indexOf("b") -> return 1 알파벳이 없다면, -1을 반환한다. 따라서, 해당 내 문자열 포함 여부는, if(arr1[1].indexOf("g") >= 0) 이런식으로 검사를 한다. - Arrays.sort, (Collections.reverseO..
프린터 문제 설명 일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다. 1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다. 2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다. 3. 그렇지 않으면 J를 인쇄합니다. 예를 들어, 4개의 문서(A, B, C, D)가 순서대로 인쇄 대기목록에 있고 중요도가 2 1 3 2 라면 C D A B 순으로 인쇄하게 됩니다. 내가 인쇄를 요청한 문서가 몇 번째로 인쇄..
문제 설명 프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다. 먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요. 제한 사항 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다. 작업 진도는 100 미만의 자연수입니다. 작업 속도는 100 이하의 자..
그리디 알고리즘, 흔히 말해 탐욕기법이다. 우선 해당 알고리즘의 동작 형태 및 구현 방법에 대해서 익혀보자 그리디 탐욕기법은, 경우의 수가 존재할 경우, 매순간 최선의 경우를 선택하는 알고리즘이다. 현재 상황에서 가장 좋다고 생각되는 것을 선택해 나가는 것이기 떄문에, 항상 가장 좋은 결과를 만드는 것은 아니다. 그럼, 그냥 문제를 바로 풀어보자 * 동전 0 https://www.acmicpc.net/problem/11047 11047번: 동전 0 첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수) w..