https://www.acmicpc.net/problem/2096 설명N은 1 이상 10만 이하로, 한 줄에는 3칸이 있고 각 칸에는 최대 9까지 올 수 있으므로, 최악의 경우의 합을 더해도 9 * 10만 = 90만으로 int의 최댓값보다 작다. 또한 메모리가 4MB인데, 4byte(int) * 3칸 * 10만 줄 = 1.2MB로, 입력받는 배열에 최댓값, 최솟값 + 기타 연산하면서 생기는 객체들까지 고려하면 메모리 초과가 날 것 같았다. 그래서 입력 배열은 따로 만들지 않고 최댓값 배열과 최솟값 배열만 만들되, 각각 2 * 3 배열을 만들어서 값을 재사용하기로 했다. 우선 N과 최댓값 배열 maxArr, 최솟값 배열 minArr을 선언해준다. 그리고 각 배열을 2*3으로 초기화해준다. i / j0..
Java
https://www.acmicpc.net/problem/11048 설명전형적인 DP 문제이다. 문제에서는 (r+1, c), (r, c+1), (r+1, c+1)로 이동할 수 있다는 부분 때문에 현재 위치를 기준으로 다음 위치의 값을 어떻게 넣어줄지 생각하게 되는데, DP는 역으로 현재 위치의 값이 과거의 어느 위치로부터 영향받았는지로 생각하면 조금 더 수월하게 풀린다. 물론 그래도 DP는 너무 어렵다.,... 문제의 답이 N, M에 도착할 때 가장 많은 사탕을 가지고 있어야 하는 경우이고, 이동은 오른쪽, 아래, 오른쪽 아래 대각선 3방향으로 밖에 이동하지 못한다는 조건으로 생각해 보자. 두 번째 조건을 반대로 생각해보면, 현재 위치에 있으려면 그전에는 왼쪽, 위, 왼쪽 위 대각선 중 하나에 있어야..
상황레디스는 각각의 명령어들은 원자적으로 실행이 되지만, 비즈니스로직을 작성하다 보면 여러 명령어들을 한 번에 처리해야 하는 경우가 생긴다. 이를 위해, 레디스를 루아스크립트를 이용해서 여러 명령어를 원자적으로 처리할 수 있도록 지원하고 있다.레디스에서 LuaScript 사용하기 127.0.0.1:6379> eval "return 'Hello world!'" 0"Hello world!"레디스로 스크립트를 실행하는 명령어는 EVAL 이며, 그 다임 인수로 “…”를 감싸서 루아스크립트를 작성하면 된다. 또한 그 다음 인수로는 이후 입력될 KEY 개수이고, 키 개수만큼 입력한 다음의 인수로는 인수를 입력받는다. EVAL [ , ..., , ...]정리하면 위와 같이 입력할 수 있다. 또한 위의 예제에서 ..
문제 @Bean(JOB_NAME + "_reader") public ItemReader itemReader() { return new JpaPagingItemReaderBuilder() .name(JOB_NAME + "_reader") .pageSize(CHUNK_SIZE) .entityManagerFactory(entityManagerFactory) .queryString("SELECT p FROM Product p") .build(); }이렇게 JpaPagingItemReader로 엔티티를 읽어오도록 하고, 각 Product 엔티티별로 price를 +1000 하는 작업을 하기로 했다. 9개를 가지고 작업을 ..
상황DB를 2개를 쓰고, 하나를 primary db로 읽기+쓰기 작업을, 나머지 하나는 replica db로 읽기 작업만 하는 DB로 구성이 되었을 때, 매번 기능을 만들 때마다 읽기/쓰기를 구분해서 데이터소스를 가져오기보다, 어노테이션의 readOnly 속성으로 알아서 데이터소스를 구분하도록 하고 싶었다. spring: datasource: hikari: main: driver-class-name: org.postgresql.Driver jdbc-url: jdbc:postgresql://localhost:54326/sample username: sample password: 1234 sub: driver-class..
문제멀티 데이터소스 환경에서, 스프링 배치 5 버전에서는 특별한 설정을 하지 않으면 @Primary 데이터소스를 가져온다. 하지만 나는 Primary가 아닌 다른 데이터소스를 가져오려고 설정을 했더니 Job이 실행이 되지 않고, 또 application.yml 파일에 적어둔 배치 설정도 적용이 되지 않던 문제가 있었다. 상황# application.ymlspring: batch: jdbc: platform: postgresql # DBMS, 안 적으면 자동으로 탐색 # 실행할 스키마, 배치 라이브러리 내부에 각 DBMS 별로 sql이 작성돼있다. schema: classpath:org/springframework/batch/core/s..
문제 스프링은 트랜잭션에 진입한 후에 커넥션을 점유하고, 이후에 데이터소스를 결정한다. 우리는 두 개의 데이터소스를 채택해서, 이중으로 커넥션을 점유하는 문제가 있었다. 상황spring: application: name: multi-source-service datasource: hikari: postgres: driver-class-name: org.postgresql.Driver jdbc-url: jdbc:postgresql://localhost:54326/sample username: sample password: 1234 postgres-two: driver-class-name: org.postgresq..
문제Jacoco로 테스트 커버리지를 검사하다 보면, lombok이 만들어준 getter, setter, 생성자 등등까지 테스트 항목에 포함되게 된다. getter, setter까지 테스트를 하는 것은 테스트를 작성하는 의미가 없다고 판단해서 이를 무시할 수 있는지 알아보았다. 해결// lombok.config# jacoco 테스트 커버리지 시, lombok이 생성한 코드는 제외lombok.addLombokGeneratedAnnotation = true 프로젝트 루트 디렉토리에 lombok.config 파일을 만들어서 위와 같이 작성해 주었다.
문제멀티 데이터소스를 채택하면서, 메인 데이터소스는 @Primary를 붙였고, 배치 데이터소스는 @Qualifier를 사용해서 가져오려고 했었다. 하지만 lombok의 @RequiredArgsConstructor 사용 시 @Qualifier 사용이 불가능했던 문제가 있다. @Slf4j@Service@RequiredArgsConstructorpublic class TestService { private final DataSource dataSource; @Qualifier("batchDataSource") private final DataSource batchDataSource; // ...}TestService는 2개의 DataSource를 주입받고 있다. @Servicepu..