μ§κ²λ€λ¦¬κ±΄λκΈ°
μΉ΄μΉ΄μ€ μ΄λ±νκ΅μ "λλμ¦ μΉκ΅¬λ€"μ΄ "λΌμ΄μΈ" μ μλκ³Ό ν¨κ» κ°μ μνμ κ°λ μ€μ μ§κ²λ€λ¦¬κ° μλ κ°μΈμ λ§λμ 건λνΈμΌλ‘ 건λλ €κ³ ν©λλ€. "λΌμ΄μΈ" μ μλμ "λλμ¦ μΉκ΅¬λ€"μ΄ λ¬΄μ¬ν μ§κ²λ€λ¦¬λ₯Ό 건λ μ μλλ‘ λ€μκ³Ό κ°μ΄ κ·μΉμ λ§λ€μμ΅λλ€.
- μ§κ²λ€λ¦¬λ μΌλ ¬λ‘ λμ¬ μκ³ κ° μ§κ²λ€λ¦¬μ λλ€λμλ λͺ¨λ μ«μκ° μ ν μμΌλ©° λλ€λμ μ«μλ ν λ² λ°μ λλ§λ€ 1μ© μ€μ΄λλλ€.
- λλ€λμ μ«μκ° 0μ΄ λλ©΄ λ μ΄μ λ°μ μ μμΌλ©° μ΄λλ κ·Έ λ€μ λλ€λλ‘ νλ²μ μ¬λ¬ μΉΈμ 건λ λΈ μ μμ΅λλ€.
- λ¨, λ€μμΌλ‘ λ°μ μ μλ λλ€λμ΄ μ¬λ¬ κ°μΈ κ²½μ° λ¬΄μ‘°κ±΄ κ°μ₯ κ°κΉμ΄ λλ€λλ‘λ§ κ±΄λλΈ μ μμ΅λλ€.
"λλμ¦ μΉκ΅¬λ€"μ κ°μΈμ μΌμͺ½μ μμΌλ©°, κ°μΈμ μ€λ₯Έμͺ½ 건λνΈμ λμ°©ν΄μΌ μ§κ²λ€λ¦¬λ₯Ό 건λ κ²μΌλ‘ μΈμ ν©λλ€.
"λλμ¦ μΉκ΅¬λ€"μ ν λ²μ ν λͺ
μ© μ§κ²λ€λ¦¬λ₯Ό 건λμΌ νλ©°, ν μΉκ΅¬κ° μ§κ²λ€λ¦¬λ₯Ό λͺ¨λ 건λ νμ κ·Έ λ€μ μΉκ΅¬κ° 건λκΈ° μμν©λλ€.
λλ€λμ μ ν μ«μκ° μμλλ‘ λ΄κΈ΄ λ°°μ΄ stonesμ ν λ²μ 건λλΈ μ μλ λλ€λμ μ΅λ μΉΈμ kκ° λ§€κ°λ³μλ‘ μ£Όμ΄μ§ λ, μ΅λ λͺ λͺ κΉμ§ μ§κ²λ€λ¦¬λ₯Ό 건λ μ μλμ§ return νλλ‘ solution ν¨μλ₯Ό μμ±ν΄μ£ΌμΈμ.
[μ νμ¬ν]
- μ§κ²λ€λ¦¬λ₯Ό 건λμΌ νλ λλμ¦ μΉκ΅¬λ€μ μλ 무μ ν μ΄λΌκ³ κ°μ£Όν©λλ€.
- stones λ°°μ΄μ ν¬κΈ°λ 1 μ΄μ 200,000 μ΄νμ λλ€.
- stones λ°°μ΄ κ° μμλ€μ κ°μ 1 μ΄μ 200,000,000 μ΄νμΈ μμ°μμ λλ€.
- kλ 1 μ΄μ stonesμ κΈΈμ΄ μ΄νμΈ μμ°μμ λλ€.
μμ
stones : [2, 4, 5, 3, 2, 1, 4, 2, 5, 1]
k : 3
answer
3
νμ΄
λ§μ½ 5λͺ μ λλμ¦ μΉκ΅¬λ€μ΄ μ§κ²λ€λ¦¬λ₯Ό λͺ¨λ 건λ μ μλμ§ μμ보기 μν΄μλ μ²μλΆν° λ§μ§λ§κΉμ§ 건λκ² ν΄λ³΄λ κ² μλλΌ, κ°μ₯ λ§μ§λ§μΈ λ€μ―λ²μ§Έκ° 건λ μ μλ€λ©΄ 5λͺ μ΄ μ§κ²λ€λ¦¬λ₯Ό 건λ μ μλ κ²μ΄κΈ° λλ¬Έμ λ€μ―λ²μ§Έμ λλμ¦κ° 건λ μ μλμ§λ§ 보면 λλ€.
μ¦ μ°λ¦¬λ nλ²μ§Έ λλμ¦κ° 건λ μ μλμ§ νλ¨νκ³ , 건λ μ μλ€λ©΄ νμ¬ μ΅λ nλͺ μ λλμ¦κ° 건λ μ μλ€κ³ μκ°νλ©΄ λλ€.
μ΄λ μ΄ λ¬Έμ μμ μ§κ²λ€λ¦¬λ₯Ό 건λμΌ νλ λλμ¦ μΉκ΅¬λ€μ μλ 무μ νμ΄μ§λ§ stones λ°°μ΄μ κ° μμμ κ°μ 1λΆν° 200,000,000μ΄νμ΄κΈ° λλ¬Έμ μ΅λλ‘ κ±΄λ μ μλ λλμ¦ μΉκ΅¬μ μλ 1
λΆν° 200,000,000
μ΄ λλ€.
(λͺ¨λ λλ€λμ μ«μκ° 200,000,000
μ΄λΌκ³ μκ°νμ λ)
μ¦, n(nλ²μ§Έ λλμ¦)μ 1λΆν° 200,000,000μ΄ λ μ μκ³ μ΄λΆ νμ
μ μ΄μ©ν΄μ nμ λ²μλ₯Ό μ°¨μ°¨ μ€μ¬κ°λ©΄μ μ§ννλ©΄ λλ€.
μμΈ νμ΄
nλ²μ§Έ λλμ¦ μΉκ΅¬κ° μ§κ²λ€λ¦¬λ₯Ό 건λ λ λλ€λμ μν©μ λ€μκ³Ό κ°λ€.
- nλ²μ§Έ λλμ¦ μΉκ΅¬κ° μ§κ²λ€λ¦¬λ₯Ό 건λλ μν©μ΄λΌλ©΄(n-1λ²μ§ΈκΉμ§λ λͺ¨λ 건λλ€κ³ κ°μ ) νμ¬ μ§κ²λ€λ¦¬μ μν©μ
λλ€λμ μ ν μ«μ - (n-1)
μ΄ λλ€.
μ²μ
2 4 5 3 2 1 4 2 5 1
4λ²μ§Έ λλμ¦κ° 건λλ μν©
0 1 2 0 0 0 1 0 2 0
λλ€λμ μ«μκ° 0μ΄ λλ©΄ λ μ΄μ λ°μ μ μμ§λ§ ν λ²μ kμΉΈκΉμ§ 건λλΈ μ μλ€.
- forλ¬Έμ λλ©΄μ
stones[current_idx] - n < 0
μΈμ§ νλ¨νκ³ 0μ΄νλΌλ©΄ cntλ₯Ό λλ¦°λ€. 건λ μ μλ λλ€λμ΄ kλ§νΌ λΆμ΄ μλ€λ©΄(cnt == k
) λμ΄μ 건λκ° μ μκΈ° λλ¬Έμ νμμ λ²μλ₯Ό μμΌλ‘ μ€μ¬μ(right = mid -1
) λ€μ μ§ννλ©΄ λλ€.
λ§μ½ nλ²μ§Έ λλμ¦κ° λͺ¨λ λλ€λμ 건λλ€λ©΄, λ λ€μ μμμ μλ λλμ¦(nλ³΄λ€ ν°)κ° λλ€λμ 건λ μλ μκΈ° λλ¬Έμ νμμ μμμ n+1(left = mid+1
)λ‘ νκ³ λ€μ μ§ννλ€. κ·Έλ¦¬κ³ μ΄λ μ΅λλ‘ κ±΄λ μ μλ λλμ¦μ μλ₯Ό λ€μ μ€μ νλ€.
μ½λ
public int solution(int[] stones, int k) {
int answer = 0;
int min = 1;
int max = 200000000;
// μ΄λΆνμμ μ΄μ©ν΄μ nμ λ²μλ₯Ό μ€μ¬κ°λ€.
while (min <= max) {
int currentIdx = (min + max) / 2;
int zeroCnt = 0;
boolean isSuccessful = true;
for (int stone : stones) {
if (stone - currentIdx < 0) { // currentIdxλ²μ§Έλ‘ μ§κ²λ€λ¦¬λ₯Ό 건λ λ λλ€λμ μνκ° 0μ΄νλΌλ©΄
zeroCnt++; // 건λμ§ λͺ»νλ λλ€λμ΄μ¬μ cntλ₯Ό μ¦κΈ°μν¨λ€
} else { // 건λ μ μλ€λ©΄
zeroCnt = 0;
}
if (zeroCnt == k) { // λ§μ½, μ°μμΌλ‘ kλ§νΌ 건λμ§ λͺ»νλ λλ€λμΌ λ
max = currentIdx - 1; // νμ λ²μλ₯Ό μ€μΈλ€
isSuccessful = false;
break;
}
}
if (isSuccessful) { // currentIdxλ²μ§Έμ λλμ¦κ° 건λλ€λ©΄
min = currentIdx + 1;
answer = currentIdx; // νμ¬ κΈ°μ€μΌλ‘ μ΅λ currentIdxλͺ
μ λλμ¦κ° 건λ μ μλ€.
}
}
return answer;
}