문제 설명
정수 배열 numbers
가 매개변수로 주어집니다. numbers
의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.
제한사항
0 ≤ numbers
의 원소 ≤ 10,000
2 ≤ numbers
의 길이 ≤ 100
입출력 예
numbers result
[1, 2, 3, 4, 5] 20
[0, 31, 24, 10, 1, 9] 744
numbers | result |
---|---|
[1, 2, 3, 4, 5] | 20 |
[0, 31, 24, 10, 1, 9] | 744 |
입출력 예 설명
입출력 예 #1
입출력 예 #1
-두 수의 곱중 최댓값은 31 * 24 = 744 입니다.
내 풀이
class Solution {
public int solution(int[] numbers) {
int answer = numbers[0]*numbers[1];
for(int i=0; i<=numbers.length-1; i++) {
for(int j=1; j<=numbers.length-1; j++) {
if(i<j && numbers[i]*numbers[j] > answer) {
answer = numbers[i]*numbers[j];
}
}
}
// [0][1]
// [0][2] [1][2]
// [0][3] [1][3] [2][3]
// [0][4] [1][4] [2][4] [3][4]
// i = 0 일 때, j=는 1 부터 시작하고, i < j 의 조건을 달아서 중복되는 값을 피했다.
return answer;
}
}
//0.01ms 나온다
처음에 문제풀이를 위해서 라이브러리를 사용하지 않고 하드코딩했을 때는
i = 0 일때, j = 1부터 증가하고 반복횟수는 Array의 길이부터 하나씩 줄어든다고 생각했다.
그래서 for문을 세번이나 써야할까? 생각했는데, 조금더 생각해보니
i < j 보다 작다는 조건을 하나 더 붙여주면, 자연스럽게 반복횟수가 적어진다는걸 떠올렸다.
나의 다른 풀이 - Arrays.sort 사용
import java.util.Arrays;
class Solution {
public int solution(int[] numbers) {
int answer = 0;
Arrays.sort(numbers);
answer = numbers[numbers.length-1]*numbers[numbers.length-2];
return answer;
}
}
//0.34ms 가 나온다!
비록 Run time이 더 오래걸리지만, 라이브러리를 활용한 코드!
Arrays.sort( )를 사용해 오름차순을 해준 후, Array.length-1 의 자리에 있는 수가 가장 큰 수일 테고, Array.length-2가 두번째로 큰 수일 테니 두개를 곱해주면 된다고 생각했다.