1. λ¬Έμ μ€λͺ π
λ¬Έμ μμ μμ΄μ΄ μ£Όμ΄μ§λλ°, μμ΄μ κΈ°λ³Έμ μΌλ‘ λͺ¨λ λν΄μ§λ€. νμ§λ§ λ§μ½ μ¬μ©μκ° μμμ μ 2κ°λ₯Ό 골λΌμ κ΄νΈλ₯Ό μ³€μ κ²½μ°, ν΄λΉ μλ κ³±ν΄μ§λ€. λͺ¨λ μλ λ¨ νλμ κ΄νΈμ ν¬ν¨λκ±°λ μλλ©΄ κ΄νΈμ μμ ν¬ν¨λμ§ μλ 2κ°μ§ μ νμ§λ°μ μλ€κ³ νμ λ, μμ΄λ‘ λ§λ€ μ μλ μ΅λκ°μ ꡬνλΌ.
μλ₯Ό λ€μ΄ μμ΄μ΄ [0,1,2,4,3,5]
λ‘ μ£Όμ΄μ‘μ λ, κ΄νΈκ° μλ€λ©΄ ν©μ 15μ΄μ§λ§, λ€μκ³Ό κ°μ΄ κ΄νΈλ₯Ό νμ©νλ©΄ 0 + 1 + (2*3) + (4*5)
κ° λλ©΄ κ°μ΄ 27λ‘ μ΅λκ° λλ€.
2. μ κ·Ό λ°©μ ποΈ
KEYWORD: GREEDY ALGORITHM
(1) κ²½μ°μ μ μκ°νκΈ°
λ¨Όμ μ£Όμ΄μ§ λ κ°μ μλ‘ μ΅λκ°μ λ§λ€ μ μλ κ²½μ°λ 무μμ΄ μμκΉ?
λ μ λͺ¨λ 0λ³΄λ€ ν΄ λ
: μ΄ κ²½μ° κ° μ€ νλκ° 1μ΄λ©΄ κ³±νλ κ²λ³΄λ€ μ°¨λΌλ¦¬ λ νλ κ²μ΄ κ°μ΄ λ ν¬λ€. μ΄λ₯Ό κ°μνμ¬ μμλΌλ¦¬μ κ³μ° μμλMath.max(o1+o2, o1*o2)
λ‘ λ μ€ μ΅λκ°μ ꡬνλλ‘ νλ€.λ μ λͺ¨λ μμ μΌ λ
: μ΄ κ²½μ°λ 무쑰건 λμ κ³±ν΄μ μμλ‘ λ§λ€μ΄μΌ μ΅λκ°μ΄λ€.o1 = 0, o2 != 0
μΌ λ, μ΄ κ²½μ°λ o2κ° μμμ΄λ©΄ κ·Έλ₯ λνκ³ , μμμ΄λ©΄ κ³±ν΄μ 0μΌλ‘ λ§λλ κ² μ°¨λΌλ¦¬ λ«λ€.
μ΄λ¬ν κ²½μ°λ₯Ό μκ°ν΄ λ¬Έμ λ₯Ό νΌλ€. λ¬Έμ μ keypointλ 0μ μ‘΄μ¬ μ¬λΆμ λ°λ₯Έ μμΈμ²λ¦¬μ΄λ€.
λκ°μ© κΊΌλ΄μ κ³μ°νλ€κ°, μμκ° 1κ° λ¨μμ κ²½μ°, 0μ΄ μμΌλ©΄ κ³±ν΄μ μ¬λΌμ§μ§λ§, 0μ΄ μμΌλ©΄ κ·Έλ₯ λμ κ°μ λν΄μΌνλ€.
(2) νμ΄ μ€λͺ
- μ°μ μμ ν 2κ°μ κ·Έλ₯ ν 1κ°λ₯Ό λ§λ λ€. κ°κ° μμμ©, μμμ©, 0μ΄ λ€μ΄κ°λ μ리μ΄λ€. μμμ© μ°μ μμνλ λ΄λ¦Όμ°¨μμΌλ‘ ν΄λλλ€.
- μμμ© μ°μ μμνκ° λΉ λκΉμ§ 2κ°μ§ κ°μ κΊΌλ΄μ κ³μ° ν μ΅λκ°μ λμ κ°μ λνλ€. (νκ° νλ λ¨μμ λλ κ·Έλ₯ λμ κ°μ λνλλ‘ μμΈμ²λ¦¬)
- μμμ© μ°μ μμνκ° 1κ° λ¨μ λκΉμ§ 2κ°μ© κΊΌλ΄μ κ³±νκ³ λμ κ°μ λνλ€.
- λ§μ½ μμμ© μ°μ μμνμ κ°μ΄ λ¨μλ€λ©΄ μ λ ₯μ 0μ΄ μ‘΄μ¬νλ©΄ λμ μ λνμ§ λ§κ³ (λμ΄ κ³±ν΄μ 0μ΄ λλ―λ‘), 0μ΄ μ‘΄μ¬νμ§ μμΌλ©΄ λμ κ°μ λνλ€.
3. μ½λ μκ° π
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
PriorityQueue<Integer> plus = new PriorityQueue<>((o1,o2) -> o2 - o1);
PriorityQueue<Integer> minus = new PriorityQueue<>();
ArrayDeque<Integer> forZero = new ArrayDeque<>();
for(int i = 0; i < N; i++){
int now = Integer.parseInt(br.readLine());
if(now > 0) plus.add(now);
if(now < 0) minus.add(now);
if(now == 0) forZero.add(now);
}
int acc = 0;
while(!plus.isEmpty()){
if(plus.size() == 1){
acc += plus.poll();
}else {
int o1 = plus.poll();
int o2 = plus.poll();
acc += Math.max(o1+o2, o1*o2);
}
}
while (!minus.isEmpty()){
if(minus.size() == 1) {
forZero.add(minus.poll());
}else {
int o1 = minus.poll();
int o2 = minus.poll();
acc += o1*o2;
}
}
while (!forZero.isEmpty()){
if(forZero.size() == 1){
acc += forZero.poll();
}else {
int o1 = forZero.poll();
int o2 = forZero.poll();
if(o1 == 0 && o2 == 0) break;
acc += Math.max(o1+o2, o1*o2);
}
}
System.out.println(acc);
}
}
4. λ°°μ΄ κ²λ€ π―
μμκ° νμλ©΄ μμλΌλ¦¬ μ§μ μ§μ λ€ λ¬΄μ‘°κ±΄ νλκ° λ¨κ³ μ§μλ©΄ λλ¨Έμ§κ° μ‘΄μ¬νμ§ μλλ€. λλ¬Έμ 0μ νλ₯Ό λ°λ‘ λ§λ€μ΄μ κ΄λ¦¬ν νμκ° μλ€. μλνλ©΄ μμκ° λ¨λλ€λ©΄ 1κ°λ§ λ¨κΈ° λλ¬Έμ 0μ λ± ν λ²λ§ μ¬μ©λκΈ° λλ¬Έμ΄λ€. λ°λΌμ 0μ΄ νλ μ΄μ μ‘΄μ¬νλ? μλλ©΄ μμ μ‘΄μ¬νμ§ μλ ν κΈλ‘ κ°μ κΈ°λ‘ ν κ³μ°νλ κ² λ ν¨μ¨μ μ΄λ€.
λλ μ΄λ₯Ό κΉ¨λ«κ³ κΈνκ² break λ¬Έμ λ§λ€μ΄ ν¨μ¨μ μκ°νλ€.
int o1 = forZero.poll();
int o2 = forZero.poll();
if(o1 == 0 && o2 == 0) break;
acc += Math.max(o1+o2, o1*o2);
λ€μμ breakλ¬Έμ μ¬μ©νμ λμ μ¬μ©νμ§ μμμ λμ μκ° μ°¨μ΄λ€.