일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- SSAFY
- 자바
- 항해플러스ai
- JUnit
- DFS
- 그리디
- JPA
- 항해플러스ai후기
- SWEA
- 싸피
- 알고리즘
- 항해솔직후기
- 다시보기
- 완전탐색
- DP
- Java
- 코테
- Union Find
- 트러블슈팅
- 백준
- 다익스트라
- 코드트리
- 유니온파인드
- Spring
- database
- 코딩테스트실력진단
- 코딩테스트
- BFS
- 알고리즘기본개념
- 그래프
- Today
- Total
목록workspace (271)
HwangHub
게시글 수정 API를 작성하고 있었다. 게시글 수정을 구현하기 위해서는 다음 정보들을 한 번에 받는다. AS-IS public record PostUpdateRequestDto( String title, // 제목 String body, // 내용 String thumbnail, // 썸네일 String category // 게시글 카테고리 ) { } 위 dto properties의 유효성 조건은 다음과 같다. 제목과 내용, 카테고리는 비어있으면 안된다. 썸네일은 없으면 기본 이미지로 제공된다. 이런 유효성 검사는 javax(or jakarta)에서 기본적으로 @NotNull, @NotEmpty, @NotBlank라는 어노테이션을 지원한다. 그렇다면 이 세가지 중 어떤걸 써야 할까? 영어를 한국어로 바꾸..
문제 링크 문제 해석 트리 구조에서 공통된 조상 중 가장 가까운 조상을 찾는 건 그래프 알고리즘 중 유니온파인드 알고리즘의 '파인드' 부분을 활용하면 될 것으로 보았다. 아울러 그 노드 기준으로 자식 노드의 개수를 세는 건 dfs로 간단하게 구현할 수 있다. 문제 풀이 시간복잡도 : DFS를 인접리스트로 구현하였고(O(V+E)), 파인드 로직에서 최소 공통 root 노드를 찾기 위한 로직에서 트리 높이(h)가 최악의 경우 노드 개수(V)에 근사해지므로 O(V + E)이다. package ssafy.사전학습; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import jav..
Lettuce Lettuce(레디스 자바 클라이언트) 적용 ; 일종의 자바 환경에서의 레디스 접근 라이브러리 (spring data redis에 lettuce 내장되어 있음) 커넥션 핸들링 제공 (나는 standalone 연결중) 동기, 비동기, 리액티브 API 제공 클러스터를 지원(별도 설정 필요), but 우리는 standalone으로 사용중이라 필요 없음 RedisTemplate redistemplate은 Redis 서버와 상호작용하기 위한 Java 언어용 템플릿입니다. Redis는 인메모리 데이터 저장소로서 키-값 쌍을 저장하고 검색하는 데 사용되며, redistemplate은 Java 애플리케이션에서 이러한 Redis 서버와 통신하는 데 도움을 주는 도구입니다. Spring Data Redis ..
BST를 탐색하는 시간복잡도가 O(logN)이라고 한다. 이를 어떻게 유도할 수 있나? 유도 과정 기본적으로 크기가 N인 ordered array가 있다고 해 보자. Binary search tree의 매커니즘과 동일하게 생각해보면, 우리는 숫자의 범위를 절반씩 잘라가는 행위를 결국에는 남은 숫자의 개수가 1이 될 때 까지 반복할 것이다. 이렇게 반복한 횟수를 k번이라 해 보자. (즉, 여기서 k가 의미하는 것은 결국 해당 연산을 몇 번 수행하냐를 의미하게 되며, 이는 BST의 탐색 연산 횟수와 같다.) 이를 수식화하면 N * (1/2)^k = 1 라고 표현할 수 있다. 이는 N = 2^k와 같다. 따라서 양 변에 밑이 2인 log를 취하면 log N = k 라는 결과가 나온다. 이는 N개의 숫자를 갖는..
SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 문제 해석 출발점부터 도착점까지 이동할 때 "최단 거리"를 구해야 함 격자 공간 위에서 이동 조건이 존재 이동할 때마다 가중치(이동 시간)는 기본 1 하지만 소용돌이 구간은 가중치가 달라짐 (시간이 더 오래 걸림) n은 2 이상 15 이하 위 조건을 고려했을 때, 모든 간선의 가중치가 양수이며 최단거리를 구하는 것이므로 다익스트라로 푸는 것을 먼저 고려해봤다. 다만, 아직 다익스트라가 익숙치 않은 탓에 우선순위 큐는 사용하지 않았고, 기본적인 BFS 로직 위에 최단 거리로 각 노드를 갱신하는 로직만 추가하여 구현하였다. 이렇게 할 경우에는 다익스트라의 시간복잡도가..
문제 인지 현재 프로젝트에 다음과 같은 문제가 있다. 우리 프로젝트에서는 레디스를 사용하여 commentCount, likeCount를 관리하고 있다. 이를 기준으로 한 sort(랭킹)을 위해서 사용한다. 하지만 정상적으로 redis가 업데이트 되고 있지 않는 것으로 확인되었다. 상황 파악 우리 프로젝트에서 레디스가 어떻게 사용되고 있는지 먼저 파악하였다. 기본적으로 직렬화할 때 TIMESTAMPS 형식을 disable 함 직렬화할 때 자바의 LocalDateTime으로 적용시킴 타입 검사할 때 non-final이 기본값으로 되도록 설정 Lettuce(레디스 자바 클라이언트) 사용 적용 자료구조 : String key-value 형태로 저장중 (우리는 로 저장) string의 prefix 가 "postC..
해석 이 문제는 인접 리스트를 이용하여 relation group의 개수를 묻는 문제이다. 따라서 그래프 탐색을 통해 연관 노드를 한번에 방문하는 방식으로 로직을 전개하면 마을의 개수를 구할 수 있다. 보통 격자 상에서의 그래프 알고리즘이 아닌, 이 문제와 같이 인접 행렬 또는 인접 리스트를 활용하는 그래프 알고리즘의 시간복잡도는 인접 행렬과 리스트 각각 O(v^2), O(v + e)이다. 이는 아래 구현된 로직에서도 확인할 수 있다. 노드의 개수가 최대 100개라고 주어져 있으므로, 인접 행렬이든 리스트든 관련 없이 문제를 풀 순 있었을 것이다. 간선의 개수는 n(n-1)/2개라고 되어있으므로 인접 행렬로 구현하였다. 풀이 DFS package ssafy.사전학습.그래프; import java.io.B..
SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 해석 이 문제는 시작 노드와 끝 노드가 정해져 있는 상태에서, 최단 거리를 구하는 문제이므로 기본적으로 BFS를 이용한 그래프 알고리즘 문제일 것이라 가정하였다. 여기서 처음에 문제를 이해할 때에는 가중치가 양수라 생각했기에 다익스트라 알고리즘이 적절할 것이라 보았다. 다익스트라는 시간복잡도가 O(ElogV)이므로 N = 100인 문제에서는 문제 없다. -- 근데 나중에 생각하니, 가중치의 범위에 대한 언급이 없어서 문제가 명확하게 조건을 제시하고 있는 것 같지는 않다. 근데 출제 의도는 다익스트라 였던 것 같다. 다익스트라 알고리즘은 특정 노드를 기준으로, 이와..
Entity의 PK를 @GeneratedValue(strategy = GenerationType.AUTO)로 해두었을 때 발생한 문제이다. 이 문제는 hibernate_sequence라는 테이블에서 PK를 조회하는데 해당 테이블이 존재하지 않아서 발생한다. hibernate_sequence 테이블이란? Hibernate5는 GenerationType.AUTO로 PK 생성 전략을 설정하면 다음 순서로 처리한다. @Id로 매핑된 Entity의 Field Type이 UUID라면 UUID Generator를 사용하여 생성한다. Integer나 Long 과 같은 numerical 타입이라면 Hibernate 설정 파일을 스캔하여 identifierGenerator를 사용하고 있는지 검사한다. 만약 사용하지 않으면..
ISSUE 운영중인 서버의 DB 스키마를 변경해야 했다. 로직을 수정하다보니 기존 스키마에 불필요한 칼럼이 존재함을 알게 된 것이다. 경우에 따라서는 칼럼을 추가해야 하는 경우도 있었다. 현재 운영 서버는 ddl-auto : none 으로 설정하고 사용하고 있다. 따라서 스키마 수정만을 위해 ddl-auto : update 처리하고 restart하는건 벼룩 잡겠다고 집을 태우는 것과 유사한 느낌이라고 판단했다. 잘 운영되고 있는 서버를 로직 수정도 아닌 상황에서 내려야 하며, ddl-auto에 의존하게 되면 어떻게 sql이 작성될지 알기 어렵다는 게 문제다. 즉, 리스크가 있는 선택이라는 거다. SQL 몇 줄 쓰는게 어려운 일도 아닌데, 참 바보같게도 과거에는 ddl-auto에 의존적으로 스키마 구성을 ..