목록분류 전체보기 (279)
HwangHub
문제 상황 게시판에 단순 접근하거나 게시글 검색을 한 결과에서는 body 내용이 간소화되어서 제공되어야 한다. 문제는, 우리 게시글들은 DB 속 게시글 테이블의 body 칼럼에 html이 들어간다는 거다. 이걸 단일 게시글 조회할때엔 프론트에서 문서화해서 보여주지만, 게시글 목록에서는 body 내용을 하나하나 모두 보여주지 않고 간소화시켜서 제공해주므로, 본문 내 이미지들을 요약문에서 보여주기엔 적절하지 않다. 따라서 이를 처리해줘야 한다. AS-IS 아래는 게시글 목록 dto 생성자이다. 저기에 있는 저 body에 들어가는 문자열을 처리해줘야 한다. public PostSimpleData(...) { this.postId = postId; this.authorId = authorId; this.main..
제목에서 알 수 있듯, 2024-01-09 20:20:30.603778와 같이 LocalDateTime 형식의 데이터를 "yyyy. M. d" 형식으로 파싱하여 제공하려고 한다. 기획 요구사항에서 "2024. 01. 09."도 아니고, "2024. 1. 9."도 아니라 정확히 "2024. 1. 9"와 같은 형식을 요구하였기에, 해당 처리를 어떻게 할지 알아보았다. 알아보니, 이러한 형식은 자주 사용되는 형식이라 자바에서는 자주 사용하는 날짜 형식에 대하여 FormStyle이라는 enum 클래스를 운영하는 것을 알게 되었다. 내가 원하는 DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM)이라는 메서드를 지원하는 걸 알게 되었다. 그래서 아래와 같이 짰었다. AS..
게시글 수정 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인 문제에서는 문제 없다. -- 근데 나중에 생각하니, 가중치의 범위에 대한 언급이 없어서 문제가 명확하게 조건을 제시하고 있는 것 같지는 않다. 근데 출제 의도는 다익스트라 였던 것 같다. 다익스트라 알고리즘은 특정 노드를 기준으로, 이와..