Closed yeahdy closed 1 month ago
🤔 시간복잡도 고려사항
💡 풀이 아이디어
처음엔 이분탐색
을 통한 LIS를 이용했으나 실패
어제 문제 착각하고 이문제 이분탐색으로 먼저 풀다 실패..ㅎㅎ
이 문제에서는 연속된 증가 수열
을 찾아야함
점화식: dp[i] = dp[i-1]+1
N-mx
(최장 연속 부분 수열)🤔 시간복잡도 고려사항
시간복잡도 : O(N)
N <= 10^6 -> O(N^2) 불가
💡 풀이 아이디어 어린이들 최소한 이동 후 오름차순 정렬 -> LIS(최장 증가 부분 수열) 이동해야하는 어린이 수 = 전체 어린이 수 - LIS
cnt
: 연속된 증가 수열 길이
// 연속된 증가 수열의 길이 계산
for (int i = 1; i <= N; i++) {
if (arr[i] > arr[i - 1]) { // 현재 위치의 값이 이전 위치의 값보다 크다면 (=연속된 수열)
cnt++; // 연속된 수열의 길이 증가
LIS = Math.max(LIS, cnt); // 최장 길이 LIS 갱신
} else { // 연속되지 않으면
cnt = 1; // 길이 1로 초기화
}
}
🤔 시간복잡도 고려사항
💡 풀이 아이디어
연속하는 증가 수열
이어야 함해당 값 -1의 인덱스에서 1을 증가
시키면서 최댓값을 찾아 줌🤔 시간복잡도 고려사항
1 <= 어린이 수 <= 1,000,000
이므로 완전 탐색을 통한 방법은 안됨 O(NlogN * N)
O(N)
에 해결 가능💡 풀이 아이디어
전체 길이 - 연속해서 증가하는 부분수열의 최대 길이
dp[num] = dp[num - 1] != 0 ? dp[num - 1] + 1: 1;
나중에 보니
dp[num] = dp[num - 1] != 0 ? dp[num - 1] + 1: 1;
과dp[num] = dp[num - 1]
가 똑같은 식인데, 제가 필요없는 연산을 했다는 것을 알았습니다 ㅜ
🤔 시간복잡도 고려사항
💡 풀이 아이디어
맨앞과 맨뒤
로 고정되어 있으므로 연속으로 증가하는 최장 부분 수열을 구해야 함dp[num] = 1
dp[num] = dp[num-1]+1
처음에는 저번주에 풀었던 줄세우기(BOJ_2631)와 같은 문제라고 생각했지만, 이 문제는 단순히 증가하는 부분 수열이 아니라 연속으로 증가하는 최장 부분 수열의 길이를 구해야 하는 문제임을 꺠달았습니다,,,,, ㅎㅎㅎ DP도 더 연습해야할 것 같습니다~ ㅜㅜㅜㅜ
🤔 시간복잡도 고려사항
1<=어린이 수<=1,000,000
10^6 으로 단순 이중 반복문으로 풀 경우 시간초과 발생💡 풀이 아이디어
dp 점화식을 세우는 부분이 이해가 안가서 점화식 사용안한 블로그 참고했어요💦💦💦💦
연속되는 최장증가수열을 찾는이유? 일반적인 최장증가수열의 경우 요소들이 사이에 들어올 수 있는데, 연속되는 최장증가수열의 경우 해당 길이만큼 연속되게 있기 때문에 중간에 요소들이 들어올 수 없음! 따라서 요소들이 맨앞 맨뒤 위치로만 이동하는 것