본문 바로가기
알고리즘/백준

[Java] BOJ 1744번 수 묶기

by 컴공맨 2021. 8. 30.
 

1744번: 수 묶기

길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에

www.acmicpc.net


풀이

정렬을 사용해서 최대값을 만들도록 하여 해결했습니다.

자세한 사항은 코드의 주석을 참고해주세요.


코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
	public static int N, answer;
	public static int[] arr;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		N = Integer.parseInt(br.readLine());
		
		arr = new int[N];
		
		// 최대 최소 기준
		// 1. 음수 * 음수 (단, 큰 수 끼리 곱해야 큰 수가 됨을 주의)
		// 2. 양수 * 양수  (단, 큰 수 끼리 곱해야 큰 수가 됨을 주의)
		// 3. 만약 1이 포함된다면 *1 이아닌 +1을 한 수가 더 큰 수
		// 4. 만약 음수하나와 0만 남아있다면 음수 * 0 즉, 0이 큰 수
		
		for (int i = 0; i < N; ++i) {
			arr[i] = Integer.parseInt(br.readLine());
		}
		
		Arrays.sort(arr);
		
		int minusIdx = 0;
		// 음수 ~ 0까지의 수를 처리
		while (minusIdx < N && arr[minusIdx] < 1) {
			// 곱한 값이 양수가 된다면
			if (minusIdx + 1 < N && arr[minusIdx + 1] < 1) {
				answer += (arr[minusIdx] * arr[minusIdx + 1]);
				minusIdx += 2;
			}
			else {
				// 양수가 아니라면 그냥 더한다.
				// 즉, 0이거나 음수가 하나만 남았을 경우
				answer += arr[minusIdx++];
			}
		}
		
		int plusIdx = N - 1;
		// 양수를 처리
		while (plusIdx >= minusIdx && arr[plusIdx] > 0) {
			// 1은 곱하지 않게하고 다른 두 양수를 곱하게한다.
			if (plusIdx - 1 >= minusIdx && arr[plusIdx - 1] > 1) {
				answer += (arr[plusIdx] * arr[plusIdx - 1]);
				plusIdx -= 2;
			}
			else {
				// 1이거나 양수가 하나만 남았다면 그냥 더해준다.
				answer += arr[plusIdx--];
			}
		}
		
		System.out.println(answer);
	}
}

 

GitHub - pyo7410/Algorithm: 1일 1커밋을 목표로!

1일 1커밋을 목표로! Contribute to pyo7410/Algorithm development by creating an account on GitHub.

github.com