문제 출처
https://www.acmicpc.net/problem/1744
1744번: 수 묶기
길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에 상관없이 묶을 수 있다. 하지만, 같은 위치에 있는 수(자기 자신)를 묶는 것은 불가능하다. 그리고 어떤 수를 묶게 되면, 수열의 합을 구할 때 묶은 수는 서로 곱한 후에 더한다. 예를 들면, 어떤 수열이 {0, 1, 2, 4, 3, 5}일 때, 그냥 이 수열
www.acmicpc.net
접근 방식 및 풀이
- Greedy 알고리즘 이용
- 아래 조건을 만족하는 알고리즘 사용
- 조건 1. 음수* 음수, 양수*양수 최대값, 단! (양수 *1)은 (양수+1)값보다 작으므로 조건처리
- 조건 2. 음수*0은 최대값
- 참고 블로그
https://mygumi.tistory.com/220
백준 1744번 수 묶기 :: 마이구미
이 글은 백준 알고리즘 문제 1744번 "수 묶기" 를 풀이한다. 문제의 접근 방법은 그리디 알고리즘으로써, 어떠한 자료구조를 요구하지는 않는다. 하지만 정답 비율이 낮은 문제로써, 까다로울 수 있다. 1744번 "수..
mygumi.tistory.com
소스 코드
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
long ans =0;
for (int i = 0; i <n ; i++) {
arr[i] = sc.nextInt();
}
Arrays.sort(arr);
int left = 0;
int right = n-1;
ans = 0;
// 0, 음수일 경우 처리
for (; left < right ; left+=2) {
if(arr[left] <1 && arr[left+1] < 1){
ans += arr[left] * arr[left+1];
}else{
break;
}
}
// 양수일 경우 처리
for (; right >0; right-=2) {
// 1과는 곱하지 않게 조건문 추가.
if(arr[right] >1 && arr[right-1] > 1){
ans += arr[right] * arr[right-1];
}else{
break;
}
}
//남은 값들은 더해주기
for (; right >= left; right--) {
ans += arr[right];
}
System.out.println(ans);
}
}
결과

'Competition > Baekjoon' 카테고리의 다른 글
[백준] 1783번 자바 병든 나이트 (0) | 2020.04.05 |
---|---|
[백준] 11729번 하노이의 탑 (0) | 2020.04.03 |
[백준] 11728번 자바 배열 합치기 (0) | 2020.04.02 |