본문 바로가기

전체 글

(276)
Programmers - 쿼드압축 후 개수 세기 with JAVA 문제 2의 N승 X 2의 N승 크기의 배열이 주어지고 이 배열은 0 또는 1로 이루어진다. 이 때, 연속적으로 4만큼 배열을 나누어 해당 범위안에 모든 숫자가 같으면 묶을 수 있다. 묶게 된다면 해당 그룹은 모두 0 또는 1 하나로 묶인다. 이 때, 0의 개수와 1의 개수를 구하라. 로직 1. 초기 배열의 크기를 구한다. 2. 4등분 한다. 3. 4등분한 각 파트가 모두 0이거나 1인지 확인한다. 4. 3번이 참이라면 0 또는 1을 결과로 증가시킨다. 5. 3번이 거짓이라면 해당 범위를 다시 4로 나누어 반복한다. 추가적으로, 만약 초기 값이 모두 같은 값인지 처음에 체크해 같다면 0또는 1을 1개로해서 반환한다. 코드 1 class Solution { public static int[] answer =..
Programmers - 자물쇠와 열쇠 with JAVA 문제 자물쇠와 열쇠가 주어지고 열쇠는 회전이 시계방향으로 90도 회전이 가능하다. 자물쇠와 열쇠의 상호간 돌기와 홈이 딱 맞으면 자물쇠를 풀 수 있다. 해당 열쇠로 자물쇠를 풀 수 있는지 판단하다. 로직 1. 맵 생성 - 자물쇠 크기의 3배로 설정 2. 맵에 자물쇠 설치 3. 키를 0도 - 90도 - 180도 - 270도 회전, 총 4회 반복 4. 키는 0,0으로 시작해 (0, 1), (0, 2) .... (1, 0), (1, 1) 과 같이 이동을 한다. (+연산을 통해 키 움직임) 5. 이동시마다 자물쇠가 풀리는지 체크 6. 키 제거 (- 연산을 통해 키 제거) 추가적으로, 키와 자물쇠가 만나 2가되면 열리지 않는걸로 처리한다. 추가적으로 회전 함수는 암기해두는 것이 좋다. new_key[y][x의길이..
QueryDSL - 3중 Join N+1 해결 보통 두개의 테이블에서 N+1 문제 발생시 Left Join을 통해서 해결을 한다. API 제작 중에 3개의 테이블을 Left Join해서 N+1문제를 해결하고자 하였으나 쿼리문을 3개 발생시켜 이를 해결해서 쿼리문의 양을 줄이고 DB 서버에 부하를 줄이고자 하였다. API API를 간단하게 설명하면 사용자가 음식점에서 예약을 하면 예약이 DB에 영속화 된다. 이 후 정보 요청시 예약만한 경우에는 예약 정보만을 출력하지만 사용자가 해당 예약정보에 맞는 주문까지 하고 정보 요청시 총 3가지의 정보가 들어가게 된다. 기존 코드 해당 코드처럼 작성시 총 3개의 쿼리문이 발생한다 N+1문제는 발생하지 않지만 두개의 left join이 제대로 처리되지 않는다. 예를 들어, 1번 테이블과 2번테이블은 1대1, 2번..
Lombok @ToString - StackOverflow Error Lombok을 통해 @ToString을 사용할 때 뿐만아니라 다른 애너테이션을 사용할 때, 자주 StackOverFlow가 발생한다. 원인, 해결방법 순으로 블로그를 정리하고자 한다. 원인 : java.lang.StackOverflowError, Handler dispatch failed: java.lang.StackOverflowError 원인 JPA 연관관계 매핑 후, toString()을 사용하게 되면 발생을 한다. 예를 들어, 조인이 되어있는 3가지의 테이블이 있다고 가정하자. 이러한 경우 3가지의 테이블은 서로 양방향 관계인데, 서로 다른 엔터티가 서로 toString을 무한으로 호출하면서 StackOverFlow가 발생하는 것이다. 자세한 예로 Member - Store - Order 해당 테..
XOR 연산 with JAVA XOR 연산을 위한 코드를 기록해두려고 한다. 아래 코드는 순서대로 리스트의 값들을 XOR 연산하는 코드이다. public static int getXOR(List result) { int sum = result.get(0); for (int i = 1; i < result.size(); i++) { sum ^= result.get(i); } return sum; }
Effective JAVA - Item5 : 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. 요약 많은 클래스가 하나 이상의 자원에 의존하는 상황을 고려해보자 예를 들어, 맞춤법을 확인해주는 클래스는 여러가지 단어가 존재하고 언어가 여럿 존재하기에 하나의 인스턴스를 만들어 사용하는 정적 유틸리티 방식이나 싱글턴 방식을 사용하면 해당 경우에서 유연한 사용이 불가능하다. 예를 들어, 하나의 사전 인스턴스를 만들어놓고 이를 활용해 맞춤법을 확인해주는 클래스는 유연하지 못한 것이다. 즉, 사용하는 자원에 따라 동작이 달라지는 클래스는 정적 유틸리티 클래스나 싱글턴으로 사용하기에 적합하지 않다. 의존 객체 주입 방식 이러한 경우에는 해당 클래스(맞춤법 클래스)에 대한 인스턴스를 생성할 때, 생성자를 통해 필요한 자원(사전 클래스)를 넘겨주는 방법이 가장 적합하다. public class spellChec..
Programmers - 스티커 모으기 with JAVA 문제 원형으로 된 스티커판이 있고 각 스티커판에는 점수가 적혀있다. 하지만 한 스티커를 뗀다면 양쪽 두 스티커는 뗄수 없다. 이 때, 스티커를 뽑아 만들 수 있는 최대값을 구하라. 로직 이 문제는 프로그래머스의 도둑질과 거의 똑같은 문제이다. 사실 값들만 다르고 같은 로직을 사용한다. 하지만 기억이 나지 않았고 기억을 위해 기록해 외워 두려고 한다. 1. 두 배열 생성 1-1. Arrays.copyOfRange(array, 0, len-2); 1-2. Arrays.copyOfRange(array, 1, len-1); 2. 두 배열 합치기 int[][] list = {list1, list2}; 3. 배열마다 확인하며 dp처리 4. 각 배열마다 마지막 값들 중 최대값이 정답 코드 import java.uti..
Programmers - 메뉴 리뉴얼 with JAVA 문제 여러명의 손님들이 각자 주문했던 음식 리스트가 있다. 이를 활용해 최소 2명의 손님이 주문한 2개이상의 음식세트를 만들려고 한다. 이 때, 음식세트의 주문수가 최대인것들을 정렬해서 출력하라. 로직 1. 각 주문마다 course에 맞는 조합 맵 구하기 : map , 조합마다 글자 길이에 맞는 최대값 갱신 : maxCount 2. 조합의 길이마다 최대값이 2보다 같거나 크면서 맵의 값(주문 된 횟수)이 최대값인 경우 결과에 반영 : answer 3. answer 정렬 예를 들어, [1, 2, 3, 4, 5]가 있다고 가정할 때 (각 번호는 음식 번호를 의미) 음식의 종류 3개로 만들 수 있는 조합은 [1, 2, 3] [1, 2, 4] [1, 2, 5] [1, 3, 4] 이런식으로 나갈 것이다. 이러한 ..