문제링크 : https://www.acmicpc.net/problem/1744
1744번: 수 묶기
길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에
www.acmicpc.net
접근 과정 :
- 음수인 경우, 0과 1, 1보다 큰 수로 나누어서 접근했다.
- 음수 : 가장 작은 음수부터 2개씩 묶어서 곱함
- 음수의 개수가 홀수이고 0이 존재하면 해당 음수는 없어짐 / 만약에 0이 없으면 해당 음수를 더함
- 1 : 1의 개수만큼 더함
- 1보다 큰수 : 가장 큰 수부터 2개씩 묶어서 곱하고, 홀수면 남은 숫자는 더함
소스 코드 및 결과 :
package BOJ;
import java.io.*;
import java.util.*;
/*
수 묶기
*/
public class BOJ1744 {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
List<Integer> negative = new ArrayList<>();
int[] zeroAndOne = new int[2];
List<Integer> positive = new ArrayList<>();
for (int i = 0; i < N; i++) {
int x = Integer.parseInt(br.readLine());
if (x < 0) {
negative.add(x);
} else if (x > 1) {
positive.add(x);
} else {
zeroAndOne[x]++;
}
}
Collections.sort(negative);
Collections.sort(positive, Collections.reverseOrder());
long sum = 0;
if (negative.size() > 1) {
for (int i = 0; i <negative.size()-1; i+=2) {
sum += (negative.get(i) * negative.get(i + 1));
}
}
if (negative.size() % 2 == 1 && zeroAndOne[0] == 0) {
sum += negative.get(negative.size() - 1);
}
if (positive.size() > 1) {
for (int i = 0; i < positive.size()-1; i+=2) {
System.out.println(positive.get(i)+ " "+positive.get(i+1));
sum += (positive.get(i) * positive.get(i + 1));
}
}
if (positive.size() % 2 == 1) {
sum += positive.get(positive.size() - 1);
}
sum += zeroAndOne[1];
System.out.println(sum);
}
}
P.S
단순하게 조건 분기로 풀이가 가능한 문제이다.
근데.. 쉽다고 생각하고 실수가 많았다...
쉬워보여도 좀 더 집중해야 할듯
'Algorithm' 카테고리의 다른 글
[백준 Gold 1] 1700 멀티탭 스케줄링 - Java (0) | 2021.12.24 |
---|---|
[백준 Gold 4] 1339 단어 수학 - Java (0) | 2021.12.23 |
[백준 Silver 5] 10610 30 - Java (0) | 2021.12.23 |
[백준 Gold 3] 1937 욕심쟁이 판다 - Java (0) | 2021.12.23 |
[백준 Silver 1] 1309 동물원 - Java (0) | 2021.12.23 |