오늘의 학습 키워드
</> 탐욕법
공부한 내용 본인의 언어로 정리하기
class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int iIndex = 0;
int jIndex = 0;
while(iIndex < g.length && jIndex < s.length){
if(g[iIndex] <= s[jIndex]){
iIndex++;
}
jIndex++;
}
return iIndex;
}
}
오늘의 회고
오늘은 아이들이 가지고 있는 욕심의 크기만큼의 쿠기를 제공하여 만족시키고 만족할 수 있는 아이가 총 몇명인지 구하는 문제였다.
처음에는 ArrayList
를 사용해서 아이들을 비교하고 해당 값이 만족된다면 그 값을 제거하고 난 후에 이어서 비교를 하는 방식으로 반복문을 사용하면서 풀었다.
하지만 23번 테스트케이스에서 g
값과 s
값이 대량으로 입력되었고 그 과정에서 시간초과가 나버려서 실패를 했다.
그 이유를 알아보니 매번 제거되는 과정에서 엄청난 시간이 걸리게 되어 실패하게 되었다고 했다.
그래서 아예 방식을 바꿔서 제공된 조건이 만족이 된다면 만족되는 만큼의 아이의 순서만 반환을 해주면 되겠다고 생각하여 방식을 바꿔서 진행하였다.
우선 배열 g
와 배열 s
의 값을 오름차순으로 정렬을 해주었고 내가 구해야하는 순서도 객체를 만들어 초기화를 해주었다.
Arrays.sort(g);
Arrays.sort(s);
int iIndex = 0;
int jIndex = 0;
그리고 이번에는 for
문 대신에 전체값을 반복해주기 위해 while
을 사용하며 최대 범위의 조건을 걸어주었다.
while(iIndex < g.length && jIndex < s.length)
그리고 문제에서 주어진 조건인 s[j] >= g[i]
에서 i와 j는 내가 초기화한 iIndex
, jIndex
와 같으므로 똑같이 입력해준다.
if(g[iIndex] <= s[jIndex])
내부의 과정에서 조건이 만족한다면 다음 아이를 아니라면 다음 쿠키를 증가시켜서 조건을 비교시켜 주었다.
if(g[iIndex] <= s[jIndex]){
iIndex++;
}
jIndex++;
}
그리고 최종적으로 증가된 iIndex
를 반환해준다면 만족시킨 아이의 순서가 되므로 만족한 아이의 수와 같아진다.
AI 코드리뷰
현재 코드의 장점
현재 코드의 단점
시간 복잡도
import java.util.Arrays;
class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int childIndex = 0;
int cookieIndex = 0;
// 두 배열을 한 번씩만 순회하며 최적의 쿠키 분배를 찾는다.
while (childIndex < g.length && cookieIndex < s.length) {
if (g[childIndex] <= s[cookieIndex]) {
childIndex++;
}
cookieIndex++;
}
return childIndex;
}
}
개선된 코드의 장점
개선된 코드의 단점
시간 복잡도
전체적으로 시간 복잡도는 여전히 𝑂(𝑛log𝑛+𝑚log𝑚)입니다.
이와 같은 개선은 성능에 큰 변화를 주지 않지만, 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.
내일 공부할 것 :
다른 방법도 한번 탐색을 해보아야겠다.
문제
GOAT