일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- ObjectOptimisticLockingFailureException
- 우아한 테크러닝
- @transactional
- jpa
- 소수찾기 java
- spring DI
- 낙관적 락 롤백
- 알고리즘
- ObjectOptimisticLockingFailureException 처리
- 백준
- DI
- S3
- Invalid property 'principal.username' of bean class
- kotest testcontainers
- 멀티모듈 테스트컨테이너
- interface
- OptimisticLock
- Spring Cloud Gateway
- TestContainers
- java
- 낙관적 락 재시도
- springsecurity
- RefreshToken
- redissonlock aop
- spring aop
- 형상관리
- netty
- aop
- multimodule testcontainers
- AccessToken
- Today
- Total
조급하면 모래성이 될뿐
[프로그래머스] 더 맵게 본문
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42626
코딩테스트 연습 - 더 맵게 | 프로그래머스
매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다. 섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2) Leo는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞습니다. Leo가 가진
programmers.co.kr
코드
// 모든 scoville이 K이상일때까지
// K보다 작은 scoville이 하나라도 존재한다면 -1을 반환한다.
public static int solution(int[] scoville, int K) {
//들어온 순서에 상관없이 우선순위대로 나간다.
PriorityQueue<Integer> pq = new PriorityQueue<Integer>();
Arrays.sort(scoville);
// 정렬 된 최초 scoville에서 K보다 작은수만 priorityQueue에 add한다.
for ( int n : scoville ) {
pq.add(n);
}
int cnt = 0 ;
// K이상의 수가 첫번째에 나온다면 더이상 회전 할 필요가 없다.
// K미만의 수는 모두 봐야한다.
while ( pq.peek() < K ) {
if(pq.size()==1) return -1;
cnt++;
//priorityQueue는 우선순위에 따라 데이터를 뽑는다.
int newScoville = pq.poll() + pq.poll()*2 ;
// [ 1,1,2 ] , K=3 과같은경우 원래2는빠질 수 있는데 남아있게 되는 경우가존재해서 크거나 같은경우도 add를 해주어야한다.
pq.add(newScoville);
}
return cnt;
}//solution
제출 결과
후기
처음에는, K보다 작은 수를 List에 담은 후, remove(0) , remove(0)으로 앞의 2개 데이터를 삭제, 재계산한 scoville 중 작은 값만 add 하고 add 된 List를 sort()하는 방법을 선택해보았다.
효율성도 떨어지고, 문제도 조건을 정확히 고려하지 못하였다.
priorityQueue를 사용한다는 풀이를 보고 적용해보았다.
priorityQueue의 장점은 add된 데이터의 순서에 상관없이 우선순위에 따라 데이터를 poll 할 수 있다는 점이다.
priorityQueue를 활용하여 해결한 나의 풀이이다.
1. 최초 입력배열 scoville을 모두 priorityQueue에 넣어준다.
2. priorityQueue의 데이터의 첫 번째 우선순위가 K미만의 수가 계속 존재할 때까지 데이터를 2개씩 빼가면서 새로운 scoville을 계산하고 add 해주고 하는 작업을 반복한다.
* 처음에 재계산된 scoville을 add하는 대상을 K미만의 수일 때만 add 해 주었더니 테스트 케이스 6,7,10,13번만 실패했다.
문제는 [ 1,1,2 ] , K=3과 같은 데이터가 들어왔을때 1회전에 나온 결과 값 3이 add 되지 않기 때문에 K보다작은 2가 처리되지 않고 -1이 리턴되었기 때문이었다.
3을 add해서 [ 3,2 ]로 scoville을 재계산해서 2도 처리될 수 있게끔 해주어야 했다. ( 결국 답은 2회전 )
PriorityQueue라는 자료구조를 알면 쉽게 해결할 수 있는 문제인 것 같다. 몰랐다면 더 많은 고민을 했을 것이다..
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스] H-Index (2) | 2019.12.10 |
---|---|
[프로그래머스] 멀쩡한 사각형 (18) | 2019.12.07 |
[프로그래머스]소수 찾기 (0) | 2019.11.07 |
[프로그래머스] 위장 (0) | 2019.11.07 |
[프로그래머스]가장 큰 수 (0) | 2019.11.07 |