본문 바로가기

전체 글

(276)
Programmers - 리코쳇 로봇 with JAVA 로직 1. 미끄러져 방문한 노드는 방문처리해서 다시 방문하지 않아도 된다. 2. 시작점, 목표점 또한 방문 가능한 노드임을 인지한다. 코드 import java.util.*; class Solution { public int solution(String[] board) { int answer = -1; int x_len = board.length; int y_len = board[0].length(); int[] start = new int[2]; int[] end = new int[2]; int[] dx = {-1, 0, 1, 0}; int[] dy = {0, -1, 0, 1}; for(int i=0; i 0){ List now = queue.poll(); int cost = now.get(0); in..
Programmers - 표편집 with JAVA (V) 해결 이 문제는 시간복잡도를 고려해야하는 문제이다. ArrayList나 Map 등 다른 것들을 사용해서 해결하려고 했지만 시간복잡도에서 문제가 생겼고 구현하기도 어렵다. LinkedList로 해결을 하였고 코드는 아래와 같다. 원리적으로는 저장공간을 늘려 검색이나 삭제등의 복잡도를 줄이는 원리를 통해 시간복잡도를 전체적으로 줄인다. 코드 import java.util.*; class Solution { static class Node{ public Node prev; public Node next; public boolean isDeleted = false; } public static String solution(int n, int k, String[] cmd) { Stack deleted = new ..
Indexing 적용해 성능 개선 이번 블로그에서는 인덱싱을 적용해 성능개선을 시도하면서 느꼈던 고찰에 대해서 정리하고자 한다. 1. 배경 API : 전체 회원에서 특정 조건에 맞게 회원을 검색하고자 한다. DATA : 10000개의 회원이 DB에 존재하는 환경이다. DB : MySql 2. 클러스터형 인덱스 기본적으로 클러스터형 인덱스는 기본키를 중심으로 설정된다. 특징으로는 해당 테이블은 이 기본키를 기준으로 정렬된다. 따라서 클러스터형 인덱스는 정렬에 영향을 준다. 물리적으로 영향을 준다는 말이다. 아무 설정없이도 기본적으로 테이블 생성시 생성된다. 다른 칼럼으로 클러스터형 인덱스를 설정 가능하지만 보통은 기본키로 설정해두고 세컨더리 인덱스를 사용해 다른 칼럼을 인덱스로 설정하는 것이 일반적이다. 성능 측정 아이디 : a 검색 아이..
[dispatcherServlet] in context with path [] threw exception [Request processing failed:오류처리 클래스명] with root cause 1. 문제 발생 과정 로그인 API를 처리하는 과정에서 만약, 해당 아이디 정보가 DB에 없다면 오류 클래스를 생성하고 던진다. 이 후, @RestControllerAdvice는 이 오류 클래스가 생성된다면 이를 읽어서 적절한 조치를 취한다. 나는 해당 오류를 클라이언트에 포장해 전달하고자하는 상황이었다. 하지만 해당 오류가 클라이언트에 전달되지 않고 해당 오류만 발생을 하고 있다. 2. 해결 - 빈 관리의 문제 해당 문제는 빈 관리가 제대로 이루어지지 않아서 발생하였다. 따라서 해당 오류를 겪고 있다면 모든 빈이 제대로 주입되고 있는지 확인할 필요가 있다. Controller - Serice - DAO 주입 제대로 되는지 확인 SpringBoot의 메인 클래스에 만약 @ComponentScan을 통해 ..
Redis Cache 성능 측정 1. API 설명 음식점 예약 어플을 제작 중에 있다. 특정 조건에 따른 음식점 리스트를 출력하고자 한다. 성능 개선을 위해 캐시를 활용할 것이며 뚜렷한 변화가 있는지 측정하고자 한다. 입력 : 나라명, 도시명, 동명, 음식점 타입, 페이지, 페이지 당 크기 출력 : 해당 조건에 맞는 음식점 리스트 2. 기존 코드 - 서비스 클래스의 메서드 @Override public HashMap getStoreList(String country, String city, String dong, String type, int page, int size) { return storeDAO.getStoreList(country, city, dong, type, page, size); } - DAO 클래스의 메서드 @Over..
Programmers - 풍선 터트리기 with JAVA 문제 풍선마다 서로 다른 번호를 가지고 있으며 해당 조건에 따라 풍선을 터트리고자 한다. 조건 1. 인접한 풍선 중에 하나를 터트릴 수 있다. 조건 2. 숫자가 큰 풍선을 터트리되 한번은 숫자가 작은 풍선을 터트릴 수 있다. 이러한 경우, 마지막까지 살아남을 수 있는 풍선의 개수를 구하라. 로직 1. 마지막까지 살아남을 수 있는 풍선을 기준으로 왼쪽의 풍선 중 가장 번호를 작은 풍선의 번호를 구한다. = left_min 2. 마지막까지 살아남을 수 있는 풍선을 기준으로 오른쪽의 풍선 중 가장 번호를 작은 풍선의 번호를 구한다. = right_min -> 만약, 해당 풍선의 번호가 두 변수보다 작다면 해당 풍선 제거 가능 -> 만약 둘 중 하나보다 작다면 풍선 제거 가능 -> 만약 둘 모두보다 크다면 제거..
Programmers - 입국 심사 with JAVA (V) 문제 심사관들이 각각 한명을 심사하는데 걸리는 시간들이 주어지고 대기자 명수가 주어진다. 모든 사람을 검사하는데 걸리는 가장 짧은 시간은?? 로직 기본적으로 대기자수의 범위가 너무 크기때문에 자료구조를 활용하는 등의 방법은 시간 초과의 문제가 있다. 따라서 이분탐색을 사용한다. 1. s_time : 총 검사 시간의 최소값 - 1 2. e_time : 총 검사 시간의 최대값 - 배열의 가장 큰 수 * 사람 수 3. 이분 탐색 시작 (의미 : 해당 시간만큼 검사를 진행한다면 몇명을 검사할 수 있는지 확인) -> 해당 시간만큼 검사시 검사해야하는 사람을 모두 검사하지 못한다면 ? s_time = n_time + 1; -> 해당 시간만큼 검사시 검사해야하는 사람을 모두 검사한다면? e_time = n_time ..
Programmers - 경주로 건설 with JAVA 문제 맵이 주어지고 왼쪽 위 끝에서 오른쪽 아래 끝까지 도달한다. 맵에는 길이 있고 벽이 있다. 벽을 피해서 지나야 한다. 또한 직선 도로로 갈 시 100, 한번 꺾을 때마다 500의 cost가 발생한다. 가장 적은 cost를 사용하여 목표지점까지 도달한다. 로직 기존의 유사한 문제와 다른 점은 cost 조건이 상이하다는 점과 벽이 존재하는데 기존의 방문한 곳을 재방문 하는 것을 방지하는 로직이나 현재 확인하고자 하는 cost 보다 작으면 방문하지 않는 로직을 그대로 사용할 수 없다는 점이다. 그렇다면 결과적으로 최소값을 구할 수 없기 때문이다. 따라서 cost보다 작으면 방문하지 않는 로직을 사용하되, 기존보다 유하게 cost 판단을 해 이를 해결하였다. 코드1 import java.util.*; cl..