Notion - 인프런 워밍업 클럽 2기 - 백엔드 프로젝트(Kotlin, Spring) / 후기이번에 인프런에서 진행되는 워밍업 클럽에 참여해보게 되었다.평소 사용해보고 싶었던 Kotlin 프로젝트를 만들어보기 위해 참여하게 되었다.입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기 강의 | 정보근 - 인프런 입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기 강의 | 정보근 - 인프런정보근 | 이론부터 실습까지. 직접 개발한 웹사이트를 클라우드에 올리며 웹 개발 전반을 학습할 수 있습니다., [사진]개발자 고양이 용백이의 가상 프로필로 만든 포트폴리오 사이트Kotlin과 Sprinwww.inflearn.com 아래 내용..
Notion - 위상 정렬 (Topology Sort) 이번에는 위상 정렬에 대해 정리하고, 문제를 기준으로 이해해보자! https://www.acmicpc.net/problem/2252 - 줄 세우기 / Gold 3 위 문제의 예제인 아래 입력을 기준으로 설명해보도록 하겠다.4 24 23 1위상 정렬, Topology Sort?위상 정렬은 뱡향이 정해져 있는 그래프에서 순서대로 정렬하기 위해 사용되는 알고리즘이다.특히 이 알고리즘은 방향이 있으며 순환하지 않는 그래프, DAG(Directed Acyclic Graph)에만 적용이 가능하다는 조건이 붙는다. 위상 정렬을 구현하기 전에 이해해야 할 두 가지 개념을 이해해두면 도움이 될 것이다. 진입차수 (in-degree, 입력차수)어떤 노드 N으로 향하..
Notion - 동적계획법 (Dynamic Programming; DP) 이번에는 DP에 대해 정리하고, 문제를 기준으로 이해해보자! https://www.acmicpc.net/problem/1912 - 연속 합 / Silver 2 위 문제의 예제인 아래 입력을 기준으로 설명해보도록 하겠다.1010 -4 3 1 5 6 -35 12 21 -1동적계획법, DP?동적계획법, 알고리즘을 풀 때 흔히 언급되는 DP는 큰 문제를 작은 문제들로 나누어 푸는 방법이다.각 하위 문제들을 해결하고 저장하여 같은 하위 문제가 나왔을 때 이를 이용한다.쉽게 말해서 문제를 작게 나누고 해결한 값을 저장해서 활용한다는 것이다. 위 예제를 통해 먼저 살펴보자.위 예제는 최대 부분 수열의 합을 구하는 문제로 연속된 숫자의 합이 가장..
Notion - 다익스트라 이번에는 다익스트라에 대해 정리하고, 문제를 기준으로 이해해보자. https://www.acmicpc.net/problem/1916 - 최소비용 구하기 / Gold 5 위 문제의 예제인 아래 입력을 기준으로 설명해보도록 하겠다.581 2 21 3 31 4 11 5 102 4 23 4 13 5 14 5 31 5다익스트라 알고리즘?다익스트라는 한 노드에서 다른 모든 노드까지의 최단거리를 구하는 알고리즘이다.다익스트라는 2중 for문을 이용한 방법, 우선순위 큐를 이용한 탐색으로 구현 방법이 나뉜다.그럼 이번에도 그림으로 표현해보도록 하겠다. 이전 글인 플로이드 워셜과 유사하게 접근이 가능하다.INF를 사용하지만 이번에는 시작 지점만을 위한 가중치 배열인 dist를 따로 선언하여 사..
Notion - 플로이드 워셜 이번에는 플로이드 워셜에 대해서 정리하고, 문제를 기준으로 이해해보자. https://www.acmicpc.net/problem/11404 - 플로이드 / Gold 4 위 문제의 예제인 아래 입력을 기준으로 설명해보도록 하겠다.5141 2 21 3 31 4 11 5 102 4 23 4 13 5 14 5 33 5 103 1 81 4 25 1 73 4 25 2 4플로이드 워셜 알고리즘?플로이드 워셜은 모든 노드 간의 최단경로를 구할 때 사용되는 알고리즘이다.플로이드 워셜 3중 for문을 이용해서 구현할 수 있다. 우선 예제를 기준으로 표현해보자면 아래와 같다. 예제에서 나온 중복되는 경로에서의 큰 값은 제외하고 인접행렬을 만들었을 때 오른쪽과 같이 만들어 낼 수 있다.여기서 I..
Notion - DFS와 BFS DFS와 BFS에 대해서와 인접 행렬과 인접 그래프에 대해서 정리하고, 한 문제를 통해서 이해해보자.설명에 앞서 코드에 대한 기준을 정하고 시작하면 좋을 것 같아 아래 문제를 기준으로 설명하도록 하겠다. https://www.acmicpc.net/problem/1260 - DFS와 BFS / Silver 2 위 문제의 예제 1번인 아래 입력을 기준으로 설명하도록 하겠다.4 5 11 21 31 42 43 4DFS (Depth-First Search)DFS는 깊이 우선 탐색이라고 부르며, 깊은 부분부터 우선적으로 탐색하는 알고리즘이다.DFS는 Stack 자료구조 혹은 재귀 함수를 이용하여 구현할 수 있다. DFS로 위 예제를 탐색하게 되면 1 2 4 3 이라는 결과를 얻을 수..
Notion - [23년 4월 ~ 24년 7월] 잔디 1주년을 기념하며 남기는 회고록1년 회고록이지만 사실상 일기나 다름없습니다. 23년도 4월달 부터 시작된 1일 1잔디 심기가 꽉 채울 정도가 되었고, 지난 1년을 되돌아보며 계속 나아가고자 회고를 해보려고 합니다.들어가기 앞서저는 사실 1일 1잔디를 22년도에도 도전했었습니다.계기는 동료의 퇴사였고, 이대로는 안되겠다 싶어 공부를 해야겠다고 생각했습니다.하지만 혼자하는 공부는 지쳐가는 속도가 너무 빨랐고, 회사를 다니며 계속하기엔 의욕도 부족했고 자존감마저 꺾여버려 잔디를 채우지 못했었습니다. 그렇게 시간은 다시 흘러갔고 때는 23년도 4월, 퇴사를 앞두고 있었을 때 다시 한 번 정신차리고 앞으로를 위해서 나아가기로 다짐했습니다.23년 회고23년 4..
Notion - Spring Security 6 - Authentication Persistence and Session Management 이 글에서는 Spring Security 5와 6의 인증 영속성, 세션 관리에 대한 차이점과 트러블 슈팅을 진행하며 자세히 정리하기 애매했던 내용을 작성해보려고 한다.아래 내용을 참고하여 작성하였다.Authentication Persistence and Session Management :: Spring Security Authentication Persistence and Session Management :: Spring SecuritySession fixation attacks are a potential risk where it is possible for ..
문제 소개Medium / Binary Searchhttps://leetcode.com/problems/capacity-to-ship-packages-within-d-days/description/풀이public int shipWithinDays(int[] weights, int days) { int answer = 0; int left = 0, right = 0; for (int tmp : weights) { left = Math.max(left, tmp); right += tmp; } while (left mid) { day++; result = 0; } r..
문제 소개Medium / Dynamic Programminghttps://leetcode.com/problems/count-sorted-vowel-strings/description/풀이public int countVowelStrings(int n) { int[] dp = new int[]{1, 1, 1, 1, 1}; while (--n > 0) { for (int i = 3; i >= 0; i--) { // 각 인덱스 a, e, i, o 에 대한 개수를 할당함 dp[i] += dp[i + 1]; // a는 나머지 4개를 포함한 경우의 수, e는 나머지 3개를 포함한 경우의 수, i 는 나머지 2개, o는 나머지 1개, u는 제외 / u는 항상 1개 => 모두 ..
문제 소개Medium / Dynamic Programminghttps://leetcode.com/problems/all-possible-full-binary-trees/description/풀이public List allPossibleFBT(int n) { if (n%2 == 0) { return new ArrayList(); } List result = new ArrayList(); if (n == 1) { result.add(new TreeNode(0)); } else { for (int leftNodes = 1; leftNodes 이번 문제는 DFS로 풀어내야겠다는 생각은 들었지만, 그 이상으로 접근하기가 어려웠다.그렇기에 내용을 풀어..