나의 모양

[DailyCoding] 21 | largestProductOfThree 본문

SEB/Daily Coding

[DailyCoding] 21 | largestProductOfThree

kexon 2022. 8. 22. 21:34

✏️ Description

정수를 요소로 갖는 배열을 입력받아 3개의 요소를 곱해 나올 수 있는 최대값 리턴

  • 입력: int[] 타입을 요소로 갖는 임의의 배열
  • 출력: int
  • 주의사항
    • 주어진 배열은 중첩되지 않은 1차원 배열
    • 배열 요소는 음수와 0을 포함하는 정수
    • 배열 길이는 3 이상
  • 입출력 예시
int output = largestProductOfThree(new int[]{2, 1, 3, 7}); // --> 42 (= 2 * 3 * 7)

output = largestProductOfThree(new int[]{-1, 2, -5, 7}); // --> 35 (= -1 * -5 * 7)

📝 Flow

- 가장 큰 수를 곱하기 => 오름차순 정렬해서 맨 뒤에 세 개 곱해줌
- 배열에 양수 있을 때 => 큰 수 세 개 곱하면 됨
- 배열에 음수 있을 때
	- 맨 앞에 두개와 맨 뒤 제일 큰 수 곱하기
=> 두 가지 경우의 수 중 큰 수 리턴 => Math.max
int[] arr = new int[]{-1, 2, -5, 7};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));

// 양수 || 음수
int case1 = arr[arr.length - 1] * arr[arr.length - 2] * arr[arr.length - 3];
System.out.println(arr[arr.length - 1]); // 제일 큰 수     7
System.out.println(arr[arr.length - 2]); // 두번째로 큰 수  2
System.out.println(arr[arr.length - 3]); // 세번째로 큰 수 -1
// => -14

// 양수 + 음수
int case2 = arr[arr.length - 1] * arr[0] * arr[1];
System.out.println(arr[arr.length - 1]); // 제일 큰 수   7
System.out.println(arr[0]); // 음수일 때 제일 작은 수      -5
System.out.println(arr[1]); // 음수일 때 두번째로 작은 수   -1
// => 35

// 음수일 때 결과값이 달라지기 땜에 Math.max 사용!
System.out.println(Math.max(case1, case2));

📚 TIL

  • Math.max: 두 인자 비교 후 큰 값 리턴

👩🏻‍💻 Implementation

Arrays.sort(arr);

int case1 = arr[arr.length - 1] * arr[arr.length - 2] * arr[arr.length - 3];
int case2 = arr[arr.length - 1] * arr[0] * arr[1];

return Math.max(case1, case2);

💬 Thought

  • IDE로 한개씩 찍어보니까 왜 case를 두 개를 했는지 알게 되었다!!!
  • 레퍼런스 코드에서 한 줄(두번째 줄)이 의문이었는데 저게 왜 있지..? 생각하다보니 arr.length를 변수에 선언한 것이었다.
    • arr.length를 다 쓰지않고 변수에 담아줘서 사용할 수도 있겠다.
    • 코드 가독성이 좋아진다고 하기엔 변수명이나 길이가 너무 비슷해서 굳이 왜 저렇게 했는지 의문이다.
    Arrays.sort(arr);
    int arrLength = arr.length;
    
    int candidate1 = arr[arrLength - 1] * arr[arrLength - 2] * arr[arrLength - 3];
    int candidate2 = arr[arrLength - 1] * arr[0] * arr[1];
    
    return Math.max(candidate1, candidate2);
  • 며칠이 지나도 계속 생각나길래 다시 구글링을 하다 이런 글을 쓴 사람을 발견했다.
    https://www.codecademy.com/forum_questions/5286bae4548c35db2400242
    • 요약해보자면 .length는 속성으로, 배열의 길이가 결정되면 .length 내부 값이 미리 계산되어 .length를 다른 변수에 할당하는 것은 불필요하다. 왜냐하면 새로운 메모리를 할당하고 값을 복사해서 실제로 .length를 호출하는 것보다 느리기 때문이다. 
    • 이 사이트를 보면 두 사람이 관련해서 의견(?)을 주고받는데(?) 캡처한 사람의 말이 더 맞는 것 같아서 가져와봤다. 혹시 다르게 이해했다면 알려주세요!

 

 

'SEB > Daily Coding' 카테고리의 다른 글

[DailyCoding] 25 | power  (0) 2022.08.26
[DailyCoding] 24 | isSubsetOf  (0) 2022.08.25
[DailyCoding] 17 | computeSquareRoot  (0) 2022.08.12
[DailyCoding] 16 | isIsogram  (0) 2022.08.11
[DailyCoding] 08 | convertDoubleSpaceToSingle  (0) 2022.08.01
Comments