2024/05 22

99클럽 코테 스터디 5일차 TIL: [프로그래머스] 디스크 컨트롤러

https://school.programmers.co.kr/learn/courses/30/lessons/42627 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr현재 시간까지 들어온 job들을 찾는 과정에서는 job들 중에 요청 시간이 적은 순으로 빼내야 한다.이어서 현재 시간까지 들어온 job들 중 소요 시간이 가장 적은 job을 찾아야 하므로 이때는 job들 중에 소요 시간이 적은 순으로 빼내야 한다.따라서 요청 시간이 기준인 우선순위 큐와 소요 시간이 기준은 우선순위 큐로 총 2개의 큐를 사용하면 된다.주의할 점으로는, 큐를 사용할 때 항상 큐가 비어있는..

CS/Algorism 2024.05.24

99클럽 코테 스터디 4일차 TIL: [프로그래머스] 주식가격

스택을 이용해서 푸는 문제이다. 쉬웠는데 딱 한가지 실수는 while 문에서 !stack.isEmpty() 를 넣어주지 않아서 런타임 에러가 발생했다. while문을 돌면서 스택에 값이 모두 빠져 비어있는 경우에도 while문을 돌 수 있기 때문에 !stack.isEmpty() 를 잊지말고 꼭 넣어주자!import java.util.*;class Solution { public int[] solution(int[] prices) { Stack stack = new Stack(); int[] answer = new int[prices.length]; for (int i = 0; i prices[i]) { i..

CS/Algorism 2024.05.23

[백준] 12865. 평범한 배낭

https://www.acmicpc.net/problem/12865 이차원 배열을 사용한 dp로 풀 수 있는 문제이다. dp[i][j]는 i번째 아이템까지 고려했을 때, 무게 j를 채우는 최대 가치를 의미한다.  만약 3번 아이템을 고려할 차례라고 할 때, dp[3][7]은 3번 아이템을 포함하지 않았을 때 무게 7을 채우는 최대 가치(= dp[2][7])와 3번 아이템을 포함했을 때 무게 7을 채우는 최대 가치(= 3번 아이템의 가치 + dp[2][7 - 3번 아이템의 무게]) 중 더 큰 값이 된다.  즉, 다음과 같은 점화식이 나온다.dp[i][j] = max(dp[i - 1][j], value[i] + dp[i - 1][j - weight[i]])import java.io.BufferedReader..

CS/Algorism 2024.05.23

99클럽 코테 스터디 3일차 TIL: [프로그래머스] 다리를 지나는 트럭

https://school.programmers.co.kr/learn/courses/30/lessons/42583 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr문제를 딱 보고 큐를 떠올리긴 했지만 효율적인 구현을 떠올리지 못했다. 다리에 올라간 트럭은 다리 길이만큼 다리에 머무르게 되는데, 이를 어떻게 구현하는게 효율적일지 고민하다가 혼자 힘으로 풀지 못했다. 주요 포인트는 다음과 같다.처음에 다리 길이만큼 0을 넣는다.그리고 다리에 트럭을 올릴 수 있으면(무게가 가능하면) 올린다. 반면 올릴 수 없으면 트럭대신 0을 올린다.즉, 큐에는 0이든 트럭이든 다리..

CS/Algorism 2024.05.22

99클럽 코테 스터디 2일차 TIL: [백준] 2179. 비슷한 단어

https://www.acmicpc.net/problem/2179 반복문을 통해 단순히 구현하면 되는 문제이다. 단순한 문제 같지만 헤맸다. substring()을 통해 두 문자열을 비교하면 메모리 초과가 난다. 따라서 charAt으로 각 자리를 비교하면 된다. 그리고 비교 결과 다르면 반복문을 빠져나오면 된다.접두사 길이가 가장 긴 두 개 이상의 문자열을 set이나 list에 저장하려고 했으나, 굳이 할 필요 없다. 어차피 문자열들 중 가장 먼저 입력된 문자열 2개를 출력해야 하는데, sameCount와 sameCountMax가 같은 경우에 값을 갱신하지 않고 sameCount > sameCountMax인 경우에만 값을 갱신하면 자연스럽게 가장 먼저 입력된 문자열 2개만 출력할 수 있다.import j..

CS/Algorism 2024.05.21

반정규화를 통한 성능 향상

이 글은 프로젝트에서 게시글 페이징 조회시 성능 향상 과정을 기록하는 글이다. 성능 향상을 위해 적용한 것들을 순서대로 설명하겠다.1. 배치 사이즈 설정문제게시글 페이징 조회시 게시글의 좋아요 수, 댓글 수, 북마크 수를 함께 반환하기 위해 Post 엔티티를 Like, Comment, Bookmark 엔티티와 조인해야 한다. 그리고 post.getLikes().size()와 같이 Post 엔티티와 연관된 Like 엔티티의 개수가 몇개인지 판단하여 좋아요 수를 알아내는 방식을 사용했다. 그런데 이 방법은 N+1 문제가 발생한다. 해결 방법 1. 페치 조인따라서 해결 방법으로 페치 조인을 떠올렸다. 그런데 페치 조인은 ToMany 관계에 대해서 페치 조인을 하나만 적용할 수 있다. 나는 Like, Comme..

카테고리 없음 2024.05.21

MySQL에서 의도치 않게 조회시 레코드에 S락을 거는 문제

지난 번 프로젝트에서도 그렇고 이번 프로젝트에서도 동시성을 테스트하는 상황에서 데드락이 발생했다. 데드락 발생 원인을 알고자 InnoDB 로그를 살펴보니, 의도치 않게 조회시 레코드에 S락을 걸면서 데드락이 발생한 것이었다. 이에 대해 더 자세히 알아보자.MySQL이 락을 거는 방식결론부터 말하자면 MySQL은 외래키 제약이 테이블에 정의되어 있으면 레코드 삽입, 수정, 삭제시에 해당 참조 레코드에 S락을 건다. 공식 문서에서는 다음과 같이 말한다.If a FOREIGN KEY constraint is defined on a table, any insert, update, or delete that requires the constraint condition to be checked sets shared..

Trouble Shooting 2024.05.21

99클럽 코테 스터디 1일차 TIL: [프로그래머스] 베스트앨범

https://school.programmers.co.kr/learn/courses/30/lessons/42579 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr정렬 조건에 주의해야 하며, 그 외로는 해시를 사용하여 단순히 구현만 하면 되는 문제이다. 그런데 이렇게도 생각하고 저렇게도 생각해야 해서 간단한듯 좀 지저분하게 코드를 짠 거 같다.. 좀 더 효율적으로 풀 수 있는 방법이 생각나면 수정해야겠다. 그리고 항상 동적으로 배열 길이가 정해질 때, List에 값을 먼저 채운 후 list.size() 만큼의 크기의 배열을 선언하여 리스트 값을 배열로 옮기는 작..

CS/Algorism 2024.05.20

멀티 스레드 환경에서 @Transactional을 사용할 때 주의할 점

이 글에서 소개하는 내용은 동시성 환경을 테스트하기 위한 테스트 코드를 작성하던 중에 만난 문제이다. 문제우선 다음과 같이 동시성 환경을 테스트하기 위한 테스트 코드를 작성했다. 게시글인 post 엔티티를 save() 한 후10개의 스레드에서 해당 엔티티를 조회해와서 좋아요를 등록한다.@Transactional@SpringBootTestclass PostServiceTest { @Autowired private PostService postService; @Autowired private PostRepository postRepository; @Test @DisplayName("좋아요 등록 성공-한 사람이 동시에 여러번 좋아요를 눌러도 중복 저장되지 않아야 한다.") void ..

Trouble Shooting 2024.05.20

테스트 코드에서 @Transactional이 적용되지 않는 문제

상황 설명ScheduleService에 대한 테스트 코드를 작성하던 중에 다음 에러가 발생했다. Exception in thread "pool-5-thread-6" org.springframework.dao.InvalidDataAccessApiUsageException: Query requires transaction be in progress, but no transaction is known to be in progressCaused by: jakarta.persistence.TransactionRequiredException: Query requires transaction be in progress, but no transaction is known to be in progress찾아보니 트랜잭션..

Trouble Shooting 2024.05.14