![[BOJ] λ°±μ€ 2805 λ무 μλ₯΄κΈ° (JAVA)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboWuL4%2FbtsCG5LgUMu%2FgfZxbubd0t1TA8xploBv2K%2Fimg.png)

π λ¬Έμ

π± μμ΄λμ΄
μ λ ₯λλ λ무μ μ(N)μ 1 β€ N β€ 1,000,000, μ¦ O(n^2)μ κ°μ§λ μκ³ λ¦¬μ¦μ΄ μλ O(N)λλ λ λΉ λ₯Έ μκ³ λ¦¬μ¦μ μ¬μ©ν΄μΌ νλ€.
λ§μ½ Mλ―Έν°μ λ무λ₯Ό κ°μ Έκ°κΈ° μν΄μ 1~1,000,000κΉμ§μ λμ΄λ₯Ό λμ΄λΈνκ² λμ νλ©΄μ λ΅μ ꡬν μ μμ§λ§,
μ΅μ μΌ κ²½μ°λ μκ°μ΄κ³Όκ° λκ² λλ€. μ¦ λͺ¨λ κ²½μ°λ₯Ό λμ νλ λ°©μμ μ΄ λ¬Έμ μμλ ν리λ€!
ν° λ²μμμ ν΄λΉκ°μ νλλ₯Ό ꡬν΄μΌ νλ€, μ΄μ§νμ(Binary Search)μ ν΅ν΄μ ν΄λΉκ°μ ꡬν μ μλ€.
κ°μ μ ν΄λ³΄μ, λ§μ½ 1 ~ 7κΉμ§μμ 6μ ꡬν΄μΌ νλ€λ©΄ μ΄μ§νμμ μ΄λ κ² μλνλ€.

μΌλ¨ μ΄μ§νμμ νκΈ° μν΄μ μ΅μκ°, μ€κ°κ°(mid), μ΅λκ°μ ꡬν΄μΌ νλ€.
μ²μμλ μ€κ°κ°μΈ 4λ₯Ό νμνλ€, νμ§λ§ λ΅μΈ "6"μ΄ μλλ©΄μ μ€κ°κ°μΈ "4" λ³΄λ€ ν¬κΈ° λλ¬Έμ λ²μλ₯Ό 5~7λ‘ μ‘°μ νλ€.
μ΄ κ³Όμ μμ μ΅μκ°μ (mid+1) κ°μΌλ‘ κ°±μ νλ€.

μ΅μκ°μ mid +1 = 5κ° λμκ³ , μ΅μκ°κ³Ό μ΅λκ°μ μ€κ°κ°μΈ "6"μ νμνκ³ μ’ λ£νλ€.
μ¦ μμ ꡬ쑰λ₯Ό λ°λ³΅ν΄μ λ²μλ₯Ό 2λ‘ λλλ©΄μ "λ΅μ΄ μ‘΄μ¬νλ λ²μλ₯Ό μ€μ¬κ°λ©° νμνλ€"
μ λ¬Έμ λ μλ₯Ό λ무 λμ΄λ₯Ό μ§μ νκ³ , λ¨μ λ무λκ³Ό Mμ λΉλ‘ν΄μ μ΄μ§νμμ νλ€λ©΄ μκ°λ³΅μ‘λλ O(log n) μ΄λ―λ‘
O(N) λ³΄λ€ λ λΉ λ₯΄κ² λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€.
π± μ½λ λ° νμ΄
public class Main { | |
public static void main(String[] args) throws IOException { | |
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); | |
StringTokenizer st = new StringTokenizer(br.readLine(), " "); | |
int N = Integer.parseInt(st.nextToken()); | |
int M = Integer.parseInt(st.nextToken()); | |
int max = 0; | |
int[] arr1 = new int[N]; | |
st = new StringTokenizer(br.readLine(), " "); | |
for (int i = 0; i < N; i++) { | |
arr1[i] = Integer.parseInt(st.nextToken()); | |
max = Math.max(max, arr1[i]); | |
} | |
// μ΄λΆνμ λ²μ μ€μ | |
int left = 0, right = max; | |
while (left <= right) { | |
// μ΄λΆνμ μ€κ°κ° ꡬνκΈ° | |
// ex. 50~100, μ€κ°κ°μ (50+100)/2 = 75 μ΄λ€. | |
int mid = (left + right)/ 2; | |
long sum = 0; | |
for (int i = 0; i < N; i++) { | |
// μ€κ°κ°μΌλ‘ λ무 μλ₯΄κΈ° | |
int num = arr1[i] - mid; | |
if (num > 0) { | |
sum += num; | |
} | |
} | |
// μ΄λΆνμ μκ³ λ¦¬μ¦, μκ°λ³΅μ‘λλλ¬Έμ μνμ λΆκ°λ₯ νλ€. | |
if (sum < M) { | |
// μλ₯Έ λ무길μ΄λ³΄λ€ Mμ΄ ν¬λ€λ©΄, λ무 ν¬κ² μλκΈ° λλ¬Έμ λ²μλ₯Ό μ’νλ€ (μ΅λκ° μ€μ΄κΈ°) | |
right = mid-1; | |
} else { | |
// μλ₯Έ λ무길μ΄λ³΄λ€ Mμ΄ μκ±°λ κ°λ€λ©΄, λ무 μκ² μλκΈ° λλ¬Έμ λ²μλ₯Ό μ’νλ€ (μ΅μκ° ν€μ°κΈ°) | |
left = mid + 1; | |
} | |
} | |
// elseλ¬ΈμΌλ‘ μκ±°λ "κ°λ€"κΉμ§ μ°μ°ν΄μ€¬κΈ° λλ¬Έμ +1 λΆλΆμ λ€μ λΉΌμ€λ€ | |
System.out.println(left-1); | |
} | |
} |
μ€κ°κ°μ "(μ΅μκ° + μ΅λκ°) / 2" μΌλ‘ ꡬν μ μλ€. μ΄μ§νμμΌλ‘ λ²μ/2 μ© νλ©΄μ λ΅μ΄ μ‘΄μ¬ κ°λ₯ν λ²μλ₯Ό μ€μ¬λκ°λ€!
μ½λμ μ£Όμμ λ¬μλ¨μΌλ μ²μ²ν μ½μ΄λ³΄λ©΄ μ΄λΆνμμ΄ μ΄λ€ μμΌλ‘ λμνλμ§ μ μ μ μμ κ²μ΄λΌ μκ°νλ€.
νλ² κ·Έλ¦ΌμΌλ‘ κ·Έλ €κ°λ©΄μ μ΄ν΄νλ κ²μ μΆμ²νλ€!
π± λλ μ

μ΄μ§νμμ λν΄μ λ°°μ°κ² λ λ¬Έμ μλ€, κ°λ μ μκ³ μμμ§λ§ μ½λλ‘ μμ±νλ κ²κ³Ό μ νλ κ²μ μ°¨μ΄κ° λκ²
μ»Έλ κ² κ°λ€. κ·Έλλ μ΄λ‘ μ μΌλ‘ μκ³ μμκΈ° λλ¬Έμ μ΄ν΄νλλ° ν¬κ² μ΄λ ΅μ§ μμλ€.
μ΄λΆνμμ μ λ°°μλκ³ νμ©ν μ μμ μ λλ‘ μμ μ΅κ² μ°μ΅νκ² λ€.
'Algorithm > - Baekjoon' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[BOJ] λ°±μ€ 2667 λ¨μ§λ²νΈλΆμ΄κΈ° (JAVA) (0) | 2024.01.03 |
---|---|
[BOJ] λ°±μ€ 14499 μ£Όμ¬μ ꡴리기 (JAVA) (2) | 2024.01.03 |
[BOJ] λ°±μ€ 16953 A->B (JAVA) (2) | 2023.12.26 |
[BOJ] λ°±μ€ 14938 μκ°κ·ΈλΌμ΄λ (JAVA) (4) | 2023.12.25 |
[BOJ] λ°±μ€ 18111 λ§μΈν¬λννΈ (JAVA) (2) | 2023.12.21 |
λλ§μ κ°λ° λ°μ΄ν°λ² μ΄μ€!
ν¬μ€ν μ΄ μ’μλ€λ©΄ "μ’μμβ€οΈ" λλ "ꡬλ ππ»" ν΄μ£ΌμΈμ!