[프로그래머스 - 정렬] 가장 큰 수 - 문제보기 시간은 오래 걸렸지만 배울게 많은 문제였다. Comparable / Comparator 문제 풀기 전, 알고리즘 공부를 하면서 Java의 Arrays.sort()에 어떤 알고리즘을 쓰는지 찾아 봤었다. 정렬할 배열에 따라 두가지 경우로 나뉘는데, 기본데이터 타입 배열 정렬 시 - Double Pivot Quick Sort Collection 배열 정렬 시 - Tim Sort(Merge Sort + Insertion Sort) 이때, 두 번째 경우인 Colleciton을 정렬할 때는 원하는 정렬기준을 설정 할 수 있다. Comparable : 객체 내 특정 요소를 기준으로 일반적인 정렬(오름차순, 내림차순)을 할 때 compareTo()를 오버라이딩하여 사..
프로그래머스(Programmers) 예산 - 문제보기 Level3임을 감안하면 쉬운 문제였지만 몇 가지 생각할 점이 있었다. 풀이를 시작하며 low값을 가장 적은 요청금액으로, high값을 가장 높은 요청금액으로 잡고 이분탐색을 실행하였다. 이때, 아래의 1, 2번이 문제가 되었다. 각 지방에서 요청한 예산의 총 합이 정부예산보다 적을 경우 이런 경우 모든 지방이 요청한 만큼 예산을 받을 수 있다. 따라서 예산 상한선은 가장 많은 금액을 요청한 지방의 금액이 된다. 정부예산이 가장 적은 요청금액보다도 적을 경우 처음에 low값을 가장 적은 요청금액으로 잡았기 때문에 위의 경우는 탐색범위에서 벗어난다. low를 1로 변경할까 하였지만 위의 경우를 미리 체크해주고 low값은 그대로 가져가기로 하였다. 각 지..
이분탐색(Binary Search) 입력 : 정렬된 원소리스트, 찾을 값 시간복잡도 : log2 n 이분탐색 과정 정수 배열 int[] array = {2, 5, 8, 10, 15, 16, 19, 20}에서 int key = 8이 몇 번째에 위치해 있는지 찾는다고 가정하자. 가장 먼저 할 일은 탐색 범위를 정하는 것이다. 이 경우에는 주어진 정수 배열 전체를 기준으로 하므로 인덱스 0 ~ 7이 범위가 된다. 탐색 범위가 정해지면 해당 범위의 가운데에 위치한 값을 찾는다. 가운데 값은 탐색 범위의 마지막 인데스에서 첫 인덱스를 뺀 뒤 2로 나눈 수를 인덱스로 가지는 값이다. 이 경우는 (7 - 0) / 2는 3이므로 array[3]의 10이 가운데 값이 된다. key값과 가운데 값(10)을 비교한다. 1)..