본문 바로가기

전체 글

(276)
Programmers - 야근 지수 with JAVA 문제 일할 수 있는 양 N, 일마다 남은 양 리스트가 주어질 때 (ex [2, 3, 4]) N만큼 일하고 남은 일리스트의 값들의 제곱의 합의 최소를 구하라. 로직 이 문제는 우선순위 큐로 해결하면 쉽다. 하지만 이 아이디어가 떠오르질 않았어서 기록을 해두고자 한다. 1. 모든 남은 일의 양을 우선순위 큐에 넣는다(최대값 우선순위 큐) 2. 하나씩 값을 꺼내서 1을 빼고 다시 큐에 넣고 할 수 있는 일의 양 N에서도 1을 뺀다. 2-1. 만약 꺼낸 값(최대 값)이 0이라면 모든 일을 다 처리한 것이므로 종료한다. 2-2. 만약 N이 0이라면 더이상 일을 할 수 없으므로 종료한다. 코드 import java.util.*; class Solution { public long solution(int n, int..
Effective JAVA - Item4 : 인스턴스화를 막으려거든 private 생성자를 사용하라. 결론 : "자바에서 프로그래밍 중에는 가끔 인스턴스화를 막아놓고 사용하는 클래스들이 필요한데 이러한 경우 private 생성자 만을 생성해서 인스턴스화를 막자" 정적 메서드와 정적 필드만을 담은 클래스 - 객체 지향적인 사고와는 거리가 조금 먼 클래스 1. 정적 메서드를 모아놓고 사용 가능 - java.lang.Math, java.util.Arrays처럼 기본값이나 배열관련 메서드들을 모아놓을 수 있다. - java.util.Collections처럼 특정 인터페이스를 구현하는 객체들을 생성해주는 메서드들을 모아놓을 수 있다. (자바8부터는 이러한 메서드들을 인터페이스 내부에 구현 가능) - final 클래스(상속이 불가능한 클래스)와 관련된 메서드들을 모아놓을 수 있다. (상속이 불가능하기에 모아놓고 이..
Programmers - k진수에서 소수 개수 구하기 with JAVA 문제 N(1 소수 체크시 Long처리를 해야한다. (N의 최대는 100만이고 K의 최소는 3이다. 따라서 3진법으로 100만을 나타낸다면 숫자가 굉장히 커지고 int로 담아낼 수 없다.) -> 소수 체크는 해당 값의 제곱근 + 1까지 구하고 이때까지 해당 수를 나머지 없이 나눌 수 없다면 소수이다. -> 1은 소수가 아니다. 항상, 런타임 오류가 발생하면 웬만하면 범위 초가인 듯 하다. 코드 import java.util.*; class Solution { public int solution(int n, int k) { int answer = 0; StringBuilder check = new StringBuilder(); while(true){ check.insert(0, String.valueOf(n..
완전탐색 재귀호출에서 전역필드에 값 추가 아래 코드를 간단하게 설명하면 프로그래머스의 피로도 문제로 완전탐색을 통해 체크해야될 리스트를 구하고 전체를 테스트해서 해결하는 문제이다. 문제를 해결 중 한가지 발견한게 있어서 기록을 하고자 한다. find 메서드에서 전역필드 final_list에 result를 추가하는 부분이 있다. 이때, 만약 final_list.add(result)를 하게 되면 참조 변수를 더하는 꼴이 되는 것이다. 즉, 삽입 시점에는 원하는 값을 넣을 수 있겠지만 프로그램이 돌면서 result의 값이 변하게 되고 해당 알고리즘은 result를 결과적으로는 비우기 때문에 빈 List가 저장된다. 따라서, 삽입시 마다 새로운 객체를 만들어서 삽입을 해야한다. final_result.add(new ArrayList(result)); ..
Query DSL, Entity대신 DTO로 받기 Querydsl 사용시 Entity가 아닌 DTO로 받는 방법을 간단하게 정리해보고자 한다. API - 작성하고자 하는 API를 설명해보자면 가게마다 운영시간 정보가 있다. 가게 이름, 가게 쉬는 시간 리스트, 가게 시작시간, 가게 종료 시간, 예약 다시 받는 시간 간격(예를 들어, 한시간 뒤에 해당 테이블을 다시 받겠다.) - 여기서 가게 쉬는 시간은 여러 시간이 존재할 수 있으므로 다른 테이블을 통해 조인 관계로 설정을 해두었다. - 이제 API에서 클라이언트가 받고싶은 데이터는 해당 데이터 전체이다. 따라서 Entity보단 입력 받은 데이터를 그대로 전달해줄 수 있는 DTO를 통해 데이터를 전달하는게 더 효율적이다. StoreTimeInfoDTO result = queryFactory .select..
Programmers - 소수 만들기 with JAVA 문제 nums라는 배열에서 서로 다른 인덱스의 위치한 3개의 수를 골라 소수를 만들 때, 만들 수 있는 소수의 개수를 구하라. 해결 이 문제는 굉장히 간단하나 소수를 구할 때, 에라토스테네스 공식을 쓰면 아주 시간 복잡도가 개선됨을 깨달았고 Boolean[] 이 아닌 boolean[] 처리시 초기값이 모두 false 처리 됨을 몰랐던 나의 무지함을 기록하기 위해 작성한다. 에라토스테네스의 공식은 간단하게 2부터 시작하여 해당 수를 곱한 모든 수는 소수이다. 예를 들어, 2*2, 2*3, 2*4 ... 3*3, 3*4.... 모두 소수이다 따라서 소수를 미리 체크하고 모든 수 하나하나를 소수 체크할 필요없이 미리 처리해놓는 방식이다. 문제에서 3가지 수로 만들수 있는 가장 큰수가 3000이므로 범위를 아래..
Effective JAVA - Item3 : private 생성자나 열거 타입으로 싱클턴임을 보증하라. 결론 : " 싱글턴 사용시 여러가지 방식중 장단점을 고려해 사용을 하되, 열거타입을 가장 추천한다. 하지만 다른 방법들 또한 단점을 보완하는 해결책이 있으니 그 점을 유의해서 사용하자 " 싱글턴 정리 정의 : 인스턴스를 오직 하나만 만들 수 있는 클래스를 의미한다. 예시 : 함수와 같은 무상태 객체, 설계상 유일해야 하는 시스템 컴포넌트(자바에서 빈을 생각) 문제점 : 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기 어려워질 수 있다. -> 타입을 인터페이스로 정의하고 그 인터페이스를 구현하여 만든 클래스가 아니라면 싱글턴 인스턴스를 가짜 구현으로 대체하기 어렵기 때문이다. 예를 들어, Spring에서 테스트시 클래스들을 가짜 객체로 만들어 테스팅한다. 하지만 인터페이스로 구현되지 않은 ..
Programmers - 도둑질 with JAVA 문제 문제는 다음과 같다. 집마다 가지고 있는 돈이 정해져있고 도둑은 집을 털어서 최대한 많은 돈을 훔치려고 한다. 이 때, 인접해있는 집은 털 수 없으며, 집의 구조는 원의 형태를 갖고 있다. [1, 2, 3, 1] 이 있을 때, 인덱스 0을 털면 마지막 인덱스는 털 수 없다. 로직 기본적으로 이런 DP 문제의 해결방법은 간단하다. dp[0] = 인덱스 0까지 존재한다고 했을 때 털 수 있는 돈의 최대치 dp[1] = 인덱스 0~1까지 존재한다고 했을 때 털 수 있는 돈의 최대치 dp[2] = 인덱스 0~2까지 존재한다고 했을 때 털 수 있는 돈의 최대치 ... 하지만 이 문제는 좀 다르다 집의 구조가 원형이기에 처음인덱스를 털면 마지막인덱스를 털 수 없게 된다. 해결방법은 두개의 리스트를 만들어 값을..