Competition/Baekjoon

[백준] 1744번 자바 수 묶기

bisi 2020. 4. 4. 11:32
문제 출처 

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