전체 글 151

공부공부-230320

@SpringBootTest 애노테이션을 사용하면 스프링 컨테이너와 함께 테스트를 실행한다. 스프링 통합 테스트 시 보통 운영 DB가 아닌 테스트 DB를 구축한다. @Transactional 데이터베이스에는 트랜잭션이라는 개념이 있어서 insert를 하면 바로 데이터가 들어가는 게 아닌 commit을 해야 데이터가 insert가 된다. 근데 보통은 auto commit이라 바로 데이터가 들어가기는 한다. (auto-commit mode인지 아닌지의 차이) 스프링 통합 테스트 시에 @Transactional 애노테이션을 사용하게 되면 1. 테스트를 실행할 때 먼저 트랜잭션을 실행하고 2. DB에 insert 쿼리를 실행한 다음 3. 테스트가 끝날 때 롤백을 해준다. DB에 어떠한 데이터도 반영되지 않기 때..

공부공부 2023.03.20

공부공부-230319

Optional java 8부터 들어간 기능인데 null이 반환될 경우 Optional로 형변환되어 반환되도록 한다. Optional.ofNullable('null이 될 수 있는 객체') JUnit으로 테스트 진행할 때 알아둬야하는 부분 테스트 실행 순서는 장담할 수가 없다. 따라서 실행 순서 의존적으로 테스트를 작성하면 안된다. 테스트를 할 때는 정상 플로우보다는 예외 플로우가 훨씬 중요하다. 동일한 객체를 여러번 선언 후 초기화해서 써야하는 경우 의존성 주입(생성자 주입 등..)으로 생성된 객체를 주입함으로써 빈번한 작업을 줄일 수 있다. 스프링을 실행하면 스프링 컨테이너라는 스프링 통이 생성된다. @Controller 애노테이션을 추가해놓으면 해당 컨트롤러 클래스 객체를 생성해서 스프링 통에 넣어놓..

공부공부 2023.03.19

[2023-02-28]

Start Ladder 문제 정답 코드 Queue에 0부터 넣고 1, 2를 더해가며 가짓수를 찾는 방법을 생각해냈다. 결과는 시간초과 왜 이 문제가 피보나치에 있는 건지에 대해 고민했는데, 사다리를 오르는 방법이 F[n] = F[n - 1] + F[n - 2]를 따르고 있었다. 아래와 같이 피보나치 방법을 적용해서 문제를 풀었다. 똑같은 결과처럼 보이지만.. 아예 똑같은 결과는 아니다. 시간 안에 문제는 풀렸지만 답이 틀린 경우이다. got 0으로 나온 것들이 있는 것을 보면 구해야하는 피보나치 수보다 적게 구한 것 같다. 그.. modulo 법칙 중에 이런 것이 있다. 위의 법칙을 적용해서 문제를 다시 풀어보았다. 정확도는 100%로 맞았지만 timeout이 발생했다. 피보나치 수열을 만드는 횟수를 줄..

코딩테스트 2023.02.28

[2023-02-23]

Start FibFrog에서 다시 시작.. FibFrog 문제 정답 코드 1. array A의 크기가 100,000이라는 것을 알고 피보나치 수열을 27개만 구함. 0부터 26까지 구했고 26번째 피보나치 수가 아마 123,000쯤..? 되었던 것 같다. 2. 큐를 쓰든가 해서 시간복잡도를 줄여야하고 array A를 for문으로 반복하며 이전 출발 index와 가려고 하는 index의 차이가 피보나치 수만큼인지를 파악하는 방법보다는 1번에서 구해놓은 피보나치 수 배열을 for문으로 돌려서 이전 출발 index에서 피보나치 수를 더한 수가 array A에서 1인지를 파악하는 방법으로 접근해야한다. 이렇게 하면 시간복잡도의 늪에서 벗어날 수 있다. 아래는 FibFrog를 풀기 위한..생각의 늪이었다.. 이렇..

코딩테스트 2023.02.23

[2023-02-21]

Start 이전 포스팅인 [2023-02-15] 마지막에 이런 말을 하면서 사라졌는데 코딜리티 안에서는..어차피 도망쳐봤자 지옥밖에 없어서 해당 문제를 부수고 넘어갈 예정이다. CommonPrimeDivisors 문제 정답 코드 1. 유클리드 호제법을 이용해서 A와 B의 최대공약수를 구한다. 2. A와 1에서 구한 최대공약수의 최대공약수를 구한다. 3. 2에서 구한 최대공약수가 존재한다면 A를 2의 최대공약수로 나눠 몫을 구한다. 4. 몫이 1에 도달한 경우 최대공약수에 나타난 소수 외 다른 prime divisor는 존재하지 않는다는 의미이다. 5. 최대공약수가 1인 경우 최대공약수가 없다는 의미이다. -> 추가 소수가 존재한다는 의미이다. 2~5 과정을 반복한다. A와 B 모두 몫이 1이 되면 1에서..

코딩테스트 2023.02.21

[2023-02-09]

Start ChocolatesByNumbers 문제 N과 M의 최대 공약수를 구해야하는 문제였다. 유클리드 호제법을 이용해서 빠르게 최대 공약수를 구했다. CommonPrimeDivisors 문제 각각 나눠지는 소수가 같은지 파악하는 문제이다. 아니 근데..왜이렇게 풀었는지 이해가 안간다.. // you can also use imports, for example: import java.util.*; // you can write to stdout for debugging purposes, e.g. // System.out.println("this is a debug message"); class Solution { public int solution(int[] A, int[] B) { int resul..

코딩테스트 2023.02.09

[2023-01-26]

Start 성능 개선을 하러 가보겠습니다. CountNonDivisible 문제 에라토스테네스의 체 방법을 통해 소수를 구하는 방법을 알고 있었는데, 까먹었다... 1. 소수를 찾고 2. 배열에서 각 요소마다의 개수를 찾고 3. 1이나 소수일 경우 전체 요소의 개수에서 1과 소수의 개수를 뺀다. 4. 그렇지 않을 경우 배열에서 나눠본다. 했는데, 아래와 같은 결과가 나왔다. 시간복잡도가 N^2인데 이전 풀이도 N^2였는데, 좀 더 안 좋은 풀이인가보다.. 소수가 아닐 경우 전체 배열을 돌면서 나눠보는 방법 대신 소수가 아닌 수의 공약수를 구해서 배열에 존재할 경우 빼도록 구했다. 공약수를 구하는 방식은 이전 lesson이었던 lesson 10에서의 방법을 통해 구했다. 성능은 괜찮아진 것 같은데, 런타임..

코딩테스트 2023.01.26