-
[코드트리 챌린지] 세 수의 최대 곱(S3)코딩테스트/코드트리_Java 2023. 9. 7. 22:59
Q. 세 수의 최대 곱
코드트리의 난이도와 백준의 난이도는 기준이 다르지만, 실버 3 난이도의 문제이다.
정수 n과 n개의 수가 주어졌을 때, 3개의 숫자를 적절하게 골라 나올 수 있는 곱 중 최대값을 구하는 프로그램을 작성하는 문제이고, n의 범위와 주어지는 수의 범위는 아래와 같다.
- 3 ≤ n ≤ 100,000
- -1,000 ≤ 주어지는 수 ≤ 1,000
첫 번째 줄에 3개의 숫자를 적절하게 골라 나올 수 있는 곱 중 최대값을 출력하면 된다.
풀이는 아래와 같다.
1. 음수와 양수를 다른 리스트에 저장한다.
2. 이 음수와 양수들을 각각 정렬한다 (이때 양수는 오름차순으로 정렬되므로 -를 붙이면 내림차순으로 정렬하는 효과가 있다)
3. 최대값이 나올 수 있는 각각의 케이스를 골라 계산한다
3 - 1. 문제를 풀다가 0을 무시했는데, 최대값이 음수인 경우 0이 들어왔다면 0이 최대값이 되므로 이 케이스를 고려해준다.
시간복잡도를 계산하면
1. 음수, 양수 정렬 - O(2 * n log n)이고
나머지는 상수 시간에 계산이 가능하다.
코드는 아래와 같다
import java.util.*; import java.io.*; public class Main { static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); static StringTokenizer st; static StringBuilder sb = new StringBuilder(); static int n; static long res = Long.MIN_VALUE; static ArrayList<Integer> plusArr; static ArrayList<Integer> minusArr; static void input() throws IOException{ n = Integer.parseInt(br.readLine()); plusArr = new ArrayList<>(); minusArr = new ArrayList<>(); st = new StringTokenizer(br.readLine()); for (int i = 0; i < n; i++) { int j = Integer.parseInt(st.nextToken()); if (j == 0) { res = 0; continue; } if (j > 0) plusArr.add(-j); else minusArr.add(j); } } static void pro() { Collections.sort(plusArr); Collections.sort(minusArr); // 양수 * 양수 * 양수 if (plusArr.size() >= 3) { res = (long)plusArr.get(0) * plusArr.get(1) * -plusArr.get(2); } // 양수 * 음수 * 음수 -> 정답이 양수인 경우 if (minusArr.size() >= 2 && plusArr.size() > 0) { res = Math.max(res, (long)minusArr.get(0) * minusArr.get(1) * -plusArr.get(0)); } // 음수 * 음수 * 음수 if (plusArr.size() == 0) { res = Math.max(res, (long) minusArr.get(minusArr.size() - 1) * minusArr.get(minusArr.size() - 2) * minusArr.get(minusArr.size() - 3)); } if (plusArr.size() > 1 && minusArr.size() > 0) { res = Math.max(res, (long)minusArr.get(minusArr.size() - 1) * plusArr.get(plusArr.size() - 1)* plusArr.get(plusArr.size() - 2)); } System.out.println(res); } public static void main(String[] args) throws Exception{ // 여기에 코드를 작성해주세요. input(); pro(); } }
반응형'코딩테스트 > 코드트리_Java' 카테고리의 다른 글
[코드트리 조별과제] 바이러스 백신 (0) 2024.07.18 [코드트리 챌린지] 메이즈 러너 (1) 2023.10.09 [코드트리 챌린지] 세 수의 최대 곱(S3) (1) 2023.10.02 [코드트리 챌린지] 두 수의 합 (0) 2023.09.25 [코드트리 챌린지] 정수 사각형 최대 합 (0) 2023.09.16