반응형
그리디 하게 접근하여 풀수있는 문제였다.
처음엔 문제를 간단하게 생각하여 내림차순으로 정렬후 두개씩 묶는 방법으로 접근하였는데, 잘 생각해보니 음수에 대해선 오름차순으로 처리하는게 최대값을 출력할 수 있는 것을 알게되었다. 따라서 음수, 양수에 대한 pq를 따로 나누었고, 각 각의 pq에 대해서 2개씩 묶는 방식으로 처리해주었다. 또, 0에 대해서 음수가 홀수개수인경우에 대해서도 예외처리를 해주어야한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
package study5;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Collection;
import java.util.Collections;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main_bj_1744_수묶기 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N=Integer.parseInt(br.readLine());
PriorityQueue<Integer> pq1 = new PriorityQueue<>(Collections.reverseOrder());
PriorityQueue<Integer> pq2 = new PriorityQueue<>();
boolean zero=false;
for(int i=0;i<N;i++) {
int num=Integer.parseInt(br.readLine());
if(num>0) {
pq1.add(num);
}else if(num<0) {
pq2.add(num);
}else {
zero=true;
}
}
long sum=0;
while(true) {
if(pq1.size()==0 || pq1.size()==1) {
break;
}else {
long num1=pq1.poll();
long num2=pq1.poll();
if(num2==1) {
sum+=(num1+num2);
}else {
sum+=(num1*num2);
}
}
}
while(true) {
if(pq2.size()==0 || pq2.size()==1) {
break;
}else {
long num1=pq2.poll();
long num2=pq2.poll();
sum+=(num1*num2);
}
}
if(pq1.size()==1) {
sum+=pq1.poll();
}
if(pq2.size()==1) {
if(zero!=true) {
sum+=pq2.poll();
}
}
System.out.println(sum);
}
}
|
반응형
'Algorithm' 카테고리의 다른 글
[BOJ] 9202. Boggle (0) | 2020.09.12 |
---|---|
[BOJ] 5052. 전화번호 목록 (0) | 2020.09.10 |
[BOJ] 1541. 잃어버린 괄호 (0) | 2020.09.05 |
[Programmers] 방금그곡 (0) | 2020.09.04 |
[BOJ] 1786. 찾기 (0) | 2020.09.04 |