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๋ฌธ์ ์ฌ์ฉํ์ ๋์ ์ฌ์ฉํ์ง ์์์ ๋์ ์๊ฐ ์ฐจ์ด๋ค.