본문 바로가기

전체 글

(276)
Programmers - 등산 코스 정하기 with JAVA 로직 1. 양방향 맵 생성 2. 산봉우리마다 확인 3. 우선순위 큐를 통해 가장 비용이 짧은순으로 처리 - 우선 순위 큐는 비용순으로 처리 - 방문 처리 - 봉우리마다 가장 가까운 출발지 방문시 바로 종료 (비용순으로 처리하고 출발지에 번호는 상관없기에 종료 가능) - 중간비용이 이미 정답보다 크다면 종료 (예를 들어, 산봉우리 A처리 후 최소값이 5라고 가정, 산봉우리 B 처리 중 이미 비용이 5 이상이라면 더이상 처리할 필요없어짐.) 4. 비용이 가장 작으면서 산봉우리 번호가 가장 작은 구역 반환 코드 import java.util.*; class Solution { public int[] solution(int n, int[][] paths, int[] gates, int[] summits) { i..
Programmers - 블록 이동하기 with JAVA 로직 이 문제는 너무 복잡했다. 따라서 차분히 설계 후 코드를 작성하는 것이 훨씬 도움이 많이 됨을 느꼈다. 기본적으로 우선순위 큐와 방문처리 배열을 활용해 로직을 처리한다. - 우선 순위 큐에은 비용, (x1, y1), (x2, y2), 방향을 담는다. - 방문처리는 가로, 세로 둘 다 (x2, y2)를 기준으로 방문처리를 한다. - 항상 가로는 왼쪽, 세로는 위쪽이 (x1, y1)이 되도록 고정 처리한다. - 방향마다 모든 이동 경로에 대한 로직을 작성한다. 코드 import java.util.*; class Solution { public int solution(int[][] board) { int n = board.length; int m = board[0].length; // 비용, x1, y1..
Integration Test 통합 테스트란? - 각 모듈들이 서로 상호작용이 잘 이루어지는지 검증하는 테스트 과정으로, 모듈을 통합하는 과정에서 발생하는 오류들을 발견할 수 있다. - 스프링 부트에서 통합테스트는 Controller -> Service -> Repositorty에 거친 하나의 API에 대해서 각 모듈들이 잘 연결되어 있는지 체크할 수 있다. - 블랙박스 테스팅(E2E(end to end), 실제 사용자의 환경과 거의 동일한 환경에서 테스팅)을 가능하게 한다. 장, 단점 장점 : UI 없이 테스팅 가능, 모든 빈을 컨트롤러에 올려 테스트하기에 실제와 유사한 환경 제공 단점 : 모든 빈을 올리기에 시간이 오래걸리며, 특정 빈이나 계층에서 발생하는 오류를 디버깅하기가 까다롭다. 설정 1. @SpringBootTest ->..
Programmers - 110옮기기 with JAVA 문제 1과 0으로 이루어진 문자열에서 "110"들을 찾고 나머지 수와 "110"들을 합쳐 가장 작은 수를 만들어라 로직 1. 모든 "110"을 찾는다. -> 이 때, Stack을 이용해 한번의 반복에 모든 "110" 을 찾아야 시간복잡도가 충족된다. 2. 뒤에서 부터 가장 가까운 0을 찾고 모든 "110"을 해당 0 뒤에 붙여주어 가장 작은 숫자를 만든다. -> 항상, 0이 앞에 있을 수록 작기 때문이다. 코드 import java.util.*; class Solution { public List solution(String[] s) { List answer = new ArrayList(); for(String now : s){ if(now.length() =0; i--){ if(now.charAt(i)..
Programmers - 양과 늑대 with JAVA 로직 - DFS 위와 같은 상황이 있다고 가정하자. dfs의 시작은 노드번호 0부터 시작한다. 1 : 0번 방문) next = {1, 8}, 양 = 1, 늑대 = 0 2 : 0-1번 방문) next = {8, 2, 4}, 양 = 2, 늑대 = 0 3 : 0-8번 방문) next = {1, 7, 9}, 양 = 1, 늑대 = 1 -> 하지만 양과 늑대 수가 같아지므로 제외됨. 4 : 0-1-8번 방문) next = {2, 4, 7, 9} 양 = 2, 늑대 = 1 ... 즉, 방문마다 다음 방문할 노드로 해당 노드의 자식 노드들은 추가하되, 형제 노드도 추가해주면서 DFS를 돌리는 방식으로 이 문제를 해결할 수 있다. 코드 import java.util.*; class Solution { public stat..
어떤 부분에 대해 테스트 코드를 작성할 것인가? 이 블로그는 제작중인 프로젝트에 대해서 테스트 코드가 필요한 부분과 필요하지 않은 부분에 대한 고찰을 정리한 블로그입니다. 1. 패키지 목록 - 여기서 어떤 패키지는 테스트 코드를 작성하고 어떤 패키지는 테스트 코드를 작성안해도 될까라는 고민이 들었습니다. - 기본적으로 Controller, Service, DAO 패키지에 대한 내용은 Unit Test를 작성을 해야합니다. - Config, utils, interceptor, exception 패키지에 대해서도 Unit Test와 통합테스트를 통해 테스트 코드 작성이 필요합니다. - 다만, 저는 Query DSL을 사용중이라 QClass가 존재하고 data에서는 lombok을 사용하고 있습니다. 하지만 이 코드들은 테스트 코드의 필요성을 느끼지 못했습니..
java.lang.reflect.InaccessibleObjectException: Unable to make field private final java.time.LocalDate java.time.LocalDateTime.date accessible 상황 설명 엔터티를 그대로 클라이언트에 전달해주는 API가 있다. 해당 엔터티는 상위클래스에 LocalDateTime을 통해 생성, 수정에 대해 업데이트 되는 필드이다. 이 데이터는 클라이언트에 전달되지않고 DB에만 저장이 되어야 한다. 하지만 테스트 코드에서 아래와 같이 작성후 테스팅을 할 시에는 해당 오류가 발생한다. .andExpect(MockMvcResultMatchers.content().json(new Gson().toJson(response))); Json으로 변경시 해당 필드에 대한 접근 권한이 없기 때문에 발생한다. 해결방법 - 해당 필드를 반환하지 않는다. 기대 사항 - 해당 필드는 DB에만 저장하는 것이고 사용자에게 보낼 필요가 없는데 이를 구현 가능하다. 1. @Expose 애너테이..
Programmers - 길 찾기 게임 with JAVA (V) 기본 개념 -> 기본적으로 루트노드의 위치에 따라 중위, 전위, 후위 순회이다. 왼쪽, 오른쪽은 고정 1. 중위 순회 (inorder) : 왼쪽 서브 트리 -> 루트 노드 -> 오른쪽 서브 트리 순으로 방문 (가장 루트 노드에서 시작해 더이상 왼쪽 서브트리가 없을때 해당 노드를 방문처리 -> 그 노드의 루트 노드 -> 오른쪽 서브 트리 동일 처리) 방문 순서 : F -> B -> A(방문) -> B(방문) -> D -> C(방문) -> D(방문) -> E(방문) -> F(방문) -> G(방문) -> I -> H(방문) -> I(방문) 결과 : A - B - C - D - E - F - G -H - I 2. 전위 순회 (preorder) : 루트 노드 -> 왼쪽 서브 트리 -> 오른쪽 서브 트리 방문 순서..