<문제 제시>
<문제설명>
정수 배열 numbers가 매개변수로 주어집니다.
numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을
return하도록 solution 함수를 완성해주세요.
<예시 입출력>
<문제 해결 과정>
make_max와 유사한 문제지만, 예외사항이 하나 더 추가됨으로써 판단하기 어려울 것 같았다.
Try 1)
int max = 0;
int max2 = 0;
for(int i = 0; i < numbers.length; i++){
if(max < Math.abs(numbers[i])) {
max = numbers[i];
}
}
for(int i = 0; i < numbers.length; i++) {
if(max2 < Math.abs(numbers[i]) && max != numbers[i]) {
max2 = numbers[i];
}
}
System.out.println(max + " " + max2);
// 큰 수 둘다 음수일 경우
if(max < 0 && max2 < 0) {
answer = max * max2;
}
// 큰 수 둘다 양수일 경우
else if(max >= 0 && max2 >= 0) {
answer = max * max2;
}
// 아닐 경우 처리
else {
}
음수일 경우의 최댓값을 구하는 부분이 역시나 헷갈렸다.
else문으로 예외처리를 하려했지만, 다른 방안이 있을 것 같아 전면 수정하였다.
Try 2)
int answer = 0;
int max_minus = 0;
int max = 0;
// 오름차순 정렬
Arrays.sort(numbers);
max = numbers[numbers.length - 1] * numbers[numbers.length - 2];
// 정렬 후 첫번째 두번째 원소가 모두 음수일 경우
if(numbers[0] < 0 && numbers[1] < 0) {
max_minus = numbers[0] * numbers[1];
}
System.out.println(Arrays.toString(numbers));
System.out.println("max = " + max + ", max_minus = " + max_minus);
if(max_minus > max) answer = max_minus;
else answer = max;
return answer;
12개의 테스트케이스 중 11개의 테스트케이스에 통과했지만 테스트케이스 7에서 실패하였다.
모든 조건을 만족해야했기에 수정을 해야했다.
Try 3)
int answer = 0, max = 0, count = 0, max_minus = 0;
int[] copy_numbers = new int[numbers.length];
for(int test : numbers) {
if(test < 0) {
// 음수 개수 카운트를 세어 하나이면 연산하지 않아도되고,
// 둘이상이면 연산을 해야함
count++;
}
}
// 배열 모두가 양수이거나 음수가 한 개있을때
if(count < 2) {
Arrays.sort(numbers);
max = numbers[numbers.length - 1] * numbers[numbers.length - 2];
answer = max;
}
// 배열에서 음수의 개수가 2개이상일 경우
else if(count >= 2) {
// 절대값으로 배열 복사
for(int i = 0; i < numbers.length; i++) {
copy_numbers[i] = Math.abs(numbers[i]);
}
Arrays.sort(copy_numbers);
max = copy_numbers[copy_numbers.length - 1] * copy_numbers[copy_numbers.length - 2];
answer = max;
}
// 정렬 후 첫번째 두번째 원소가 모두 음수일 경우
if(numbers[0] < 0 && numbers[1] < 0) {
max_minus = numbers[0] * numbers[1];
}
if(max_minus > max) answer = max_minus;
return answer;
테스트케이스 1에서 {1,2,-3,4,-5} 같은 경우 음수의 개수는 2개이지만, 음수끼리 곱했을때
15라는 숫자가 가장 큰 값으로 나온다.
하지만 조건문에서 count >= 2일 경우 모두 절대값으로 바꾼 후 처리하면 20이라는 숫자가 나와 오답이 발생한다.
Solution 1)
int last = numbers.length;
Arrays.sort(numbers);
max1 = numbers[0] * numbers[1];
max2 = numbers[last - 1] * numbers[last - 2];
단순히 정렬 후 앞 두원소와 뒤 두 원소를 비교했을때, 앞 두 원소는(음수가 2개일 경우 큰 수 발생 가능)
뒤 두 원소는 모두 양수일 가능성이 높으므로 조건문으로 앞 두원소 = max1와 뒤 두원소 = max2 를 비교하면 된다.
<전체코드>
public class make_max2 {
public static int solution(int[] numbers) {
int answer = 0, max1 = 0, max2 = 0, count = 0;
int last = numbers.length;
Arrays.sort(numbers);
max1 = numbers[0] * numbers[1];
max2 = numbers[last - 1] * numbers[last - 2];
if(max1 > max2) answer = max1;
else answer = max2;
return answer;
}
public static void main(String[] args) {
int[] numbers = {1, 2, -3, 4, -5};
// int[] numbers = {0, -31, 24, 10, 1, 9};
// int[] numbers = {10, 20, 30, 5, 5, 20, 5};
System.out.println(solution(numbers));
}
}
비슷한 유형의 알고리즘 문제가 많아 풀이를 자주 해봐야겠다고 느꼈다.
문제링크)
https://school.programmers.co.kr/learn/courses/30/lessons/120862
'Algorithms > 프로그래머스' 카테고리의 다른 글
[프로그래머스] '숨어있는 숫자의 덧셈 (2)' - Java (0) | 2023.05.16 |
---|---|
[프로그래머스] '다항식 더하기' - Java (0) | 2023.05.15 |
[프로그래머스] '직사각형 넓이 구하기' - Java (0) | 2023.05.14 |
[프로그래머스] '제곱수 판별하기' - Java (1) | 2023.05.14 |
[프로그래머스] '치킨 쿠폰' - Java (0) | 2023.05.13 |