전체 글 썸네일형 리스트형 프로그래머스 - 야근 지수(Java) 힙 문제입니다. 일의 작업량이 정수 배열로 주어지고 야근 까지 남은 시간 n이 주어졌을 때, 야근 지수를 가장 적게 만들도록 하는 문제입니다. 야근 지수는 야근 이후에 남은 일의 작업량 원소들의 제곱 합 입니다. 그림에서 알 수 있듯이, a의 값이 클 수록 그 제곱의 크기는 급격히 커지게 됩니다. 따라서 일의 작업량을 처리할 때, 가장 큰 숫자부터 제거하는 방식을 사용해야 합니다. 자바의 PriorityQueue는 최소힙 입니다. 즉, 가장 작은 숫자부터 값을 빼낼 수 있는 구조이기 때문에 역순으로 돌려서 사용해야 합니다. [구현 코드] import java.util.*; class Solution { public static long solution(int n, int[] works) { long an.. 더보기 프로그래머스 - 네트워크(Java) bfs 문제입니다. 노드 n이 자연수로, 간선이 2차원 배열 형태로 주어집니다. 그래프에 주어진 조건을 입력하고, 노드의 개수만큼 탐색을 하면 끝나는 문제입니다. 단, 탐색을 하면서 방문한 노드는 다시 방문하지 않게 해야 합니다. [구현 코드] import java.util.*; class Solution { private static List graph; private static boolean[] visited; public static int solution(int n, int[][] computers) { int answer = 0; graph = new ArrayList(); for(int i=0; i 더보기 프로그래머스 - 최고의 집합 구현 문제입니다. 숫자 n과 그 합인 s가 주어졌을 때, 곱이 최대가 되는 집합을 구하는 문제입니다. n=2, s=9가 주어졌다고 가정하겠습니다. 이에 따르는 집합은 {1,8}, {2,7}, {3,6}, {4,5}입니다. 여기서 곱이 최대인 집합은 {4,5}입니다. 예제로 짐작할 수 있듯이, 최대 곱은 집합의 원소의 편차가 가장 적을 때 발생합니다. 편차를 작게하려면 s/n으로 이루어진 집합을 우선 구한 뒤, 나머지가 있을 때 원소에 각각 1씩 더해주면 됩니다. 나머지는 무조건 n보다 작기 때문에 집합의 최소 값은 s/n 입니다. 즉, 나머지가 없을 경우 최대는 s/n이고, 나머지가 있을 경우 최대는 (s/n)+1입니다. [구현 코드] import java.util.Arrays; class Solutio.. 더보기 프로그래머스 - N으로 표현(Java) DP 문제입니다. 1~9까지의 숫자 N이 주어졌을 때, 해당 숫자를 8개 미만으로만 사용하여 number의 값을 구하는 문제입니다. 우선 덧셈 공식을 먼저 생각을 해야하는 문제입니다. 그림과 같이 2 이상의 수는 두 자리의 덧셈으로 나타낼 수 있습니다. 이것을 단순히 덧셈이 아니라 경우의 수로 바꿔서 생각해야 합니다. N이 4가 주어진다고 가정하겠습니다. 주어진 4를 1개 사용하면 {4}입니다. 2개 사용하면 {44, 4+4, 4-4, 4*4, 4/4} = {44, 8, 0, 16, 1}입니다. 즉, 1개를 사용한 것에서 사칙연산 및 이어 붙이기를 한 것이 됩니다. 3개를 사용하면 {444, 4+4+4, 4+4-4, (4+4)*4, (4+4)/4, 4-4+4, 4-4-4, ...}입니다. 즉, 2개를 사.. 더보기 Exception in thread "main" java.util.ConcurrentModificationException Collection의 값을 반복문 내부에서 수정할 때 발생되는 예외이다. Collection의 값을 수정할 때, 삭제하는 경우 그 크기를 줄여야 한다. 하지만, 아래 코드는 삭제가 아닌 추가만 하고 있다. for(int i=2; i 더보기 토비의 스프링 - 6.9 6장 정리 6.9.1 정리 트랜잭션 경계설정 코드를 분리해서 별도의 클래스로 만들고, 비즈니스 로직 클래스와 동일한 인터페이스를 구현하면 DI의 확장 기능을 이용해 트랜잭션 부가기능을 만들 수 있음 트랜잭션처럼 환경과 외부 리소스에 영향을 받는 코드를 분리하면 비즈니스 로직에만 충실한 테스트를 만들 수 있음 목 오브젝트를 이용하면 쉽게 고립된 테스트를 만들 수 있음 DI를 이용한 트랜잭션 분리는 데코레이터 패턴과 프록시 패턴으로 이해될 수 있음 번거로운 프록시 클래스 작성은 JDK 다이내믹 프록시를 이용하면 간단히 만들 수 있음 다이내믹 프록시는 스태틱 팩토리 메소드를 사용하기 때문에 빈 등록하기 번거로움. 팩토리 빈을 사용하면 되고, 스프링은 자동 프록시 생성 기술에 대한 추상화 서비스를 제공하는 프록시 팩토리 .. 더보기 토비의 스프링 - 6.8 트랜잭션 지원 테스트 6.8.1 선언적 트랜잭션과 트랜잭션 전파 속성 REQUIRED로 전파 속성을 설정하면 앞에서 트랜잭션이 진행되고 있으면 새로운 트랜잭션을 시작하지 않고, 기존의 트랜잭션에 참여를 함 REQUIRED 전파 속성을 가진 메소드를 결합해 다양한 크기의 트랜잭션 작업을 만들 수 있음 A 메소드에서 B 메소드를 호출하는데, A와 B 작업이 모두 완료되어야만할 때, REQUIRED 전파 속성을 사용해야 함 AOP를 이용해 코드 외부에서 트랜잭션 기능을 부여해주는 방법을 선언적 트랜잭션(Declarative Transaction)이라 함 대조적으로, TransactionTemplate나 개별 데이터 트랜잭션 API를 사용해 직접 코드 안에서 사용하는 방법을 프로그램에 의한 트랜잭션(Programmatic Trans.. 더보기 토비의 스프링 - 6.7 애노테이션 트랜잭션 속성과 포인트컷 6.7.1 트랜잭션 애노테이션 포인트컷과 트랜잭션 속성을 이용해 트랜잭션을 일괄적으로 적용하는 방식은 대부분 상황에서 잘 들어맞음 하지만, 세밀하게 튜닝된 트랜잭션 속성의 경우 포인트컷과 트랜잭션 속성 사용으로는 적합하지 않음 포인트컷과 트랜잭션 속성과 같이 설정 파일에서 분류 가능한 그룹으로 만들어 일괄적으로 속성을 부여하는 대신, 직접 타킷에 속성정보를 가진 애노테이션을 지정해 세밀하게 트랜잭션 속성을 적용함 이 애노테이션을 트랜잭션 애노테이션이라 함 @Transaction 애노테이션을 정의한 코드 @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public .. 더보기 이전 1 ··· 24 25 26 27 28 29 30 ··· 49 다음 목록 더보기