Open subeenjeonHere opened 7 months ago
버블 정렬로 코드 작성, 시간 복잡도 O(n^2)
그럼, 문제에선 최대 100,000명까지 회원이 있을 수 있으므로, n^2의 연산이 수행된다. 따라서 회원 수가 100,000인 경우, 최대 10,000,000,000번의 연산이 수행된다.
arrayList.sort(new Comparator<ArrayList<String>>() {
@Override
public int compare(ArrayList<String> o1, ArrayList<String> o2) {
int a1 = Integer.parseInt(o1.get(0));
int a2 = Integer.parseInt(o2.get(0));
return Integer.compare(a1, a2);
}
});
arrayList.sort(new Comparator<ArrayList<String>>() {
@Override
public int compare(ArrayList<String> o1, ArrayList<String> o2) {
int age1 = Integer.parseInt(o1.get(0));
int age2 = Integer.parseInt(o2.get(0));
int idx1 = Integer.parseInt(o1.get(2));
int idx2 = Integer.parseInt(o2.get(2));
if (age1 == age2 && idx1 > idx2) {
return Integer.compare(idx1, idx2);
}
return 0;
}
});
Arrays.sort() 메소드 분할정복으로 동작하므로 시간 복잡도 O(n log n)
이분탐색 알고리즘 자체는 쉬웠는데, 엣지 케이스에 시간을 너무 많이 소요했다.
Idiot
이분 탐색 코드인데, 아마 몫을 다시 구하는 부분에서 코드 병목현상 발생: 시간 복잡도 O(n)
//중간값 찾기
mid = min + (max - min) / 2;
*return* Math.min(mid, min - 1);으로 하니까 정답
이진 탐색에서 UpperBound는 목표 값보다 큰 가장 작은 값이다.
이진 탐색 후, 최종 mid 값이 자를 수 있는 실제의 최대 랜선 길이가 아닐수도 있다. 정확히 N개의 랜선을 자를 수 있는 최대의 길이를 찾아야 한다.
Mid 값이 N개 이상의 랜선을 자르는 경우에도, 더 큰 Mid 값도 정확히 N개의 랜선을 자를 수 있기에
//반복문 범위
while (min <= max) {
//생략
} else if (count >= n) {
min = mid + 1;
}
범위를 최대한 좁혀나가면서, Mid 값을 찾아 나간다. 이 때 mid와 min-1 중, 최솟값을 반환해야 한다.
While 문이 종료되는 경우는 min이 max를 초과하는 경우다. 이 경우, 그 직전의 mid 값이 가능한 최대의 값 = 즉, N개 이상의 랜선을 자를 수 있었던 마지막 값이었다.
답은 정상적으로 나오는데, StringBuilder 출력초과
HashMap으로 풀었다.
수 범위를 고려했을 때 int가 아니라 long 형으로 데이터 타입 지정해야했다.
val 값 갱신 할 때, 2 2 1 2 3 이렇게 값이 온다면? 처음에 if (val=1) else (val+=1) 이렇게 설정했었는데, 2 사이에 1이 왔을 때 val이 1로 갱신되어 그 다음 2 키값이 1이 되어버린다.
for (int i = 1; i <= n; i++) {
long key = sc.nextLong();
//중복 된 값 갱신하더라도 중간에 val 1로 초기화되면 다시 1로 갱신됨
if (!map.containsKey(key)) {
val = 1;
map.put(key, val);
} else {
long newVal = map.get(key);
newVal += 1;
map.put(key, newVal);
}
}
dp[i][j] = dp[i-1][j] + d[i-1][j-1]
for (int p = 1; p < dp.length; p++) {
for (int q = 1; q < dp[0].length; q++) {
dp[p][q] = dp[p][q - 1] + dp[p - 1][q];
}
}
dp[p][q]
: p층 q호에 살고 있는 사람의 수dp[p][q - 1]
: p층 (q-1)호에 살고 있는 사람의 수dp[p - 1][q]
: (p-1)층 q호에 살고 있는 사람의 수바텀-업 방식 DP
0층 1호에는 1명, 0층 i호에는 i명이 살고 있다는 초기 조건을 먼저 DP 테이블에 채우고 시작해야 한다.
누적합으로도 풀었었는데