일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- CSS
- Spring Data JDBC
- 데일리코딩
- 인텔리제이
- Publishing
- 첫글자대문자
- Spring Security
- 부트캠프
- 깃허브
- fibonacci
- 자바
- 그리디
- 거듭제곱
- 자료구조
- testing
- 회고
- CLI명령어
- 백엔드
- spring data jpa
- 컬렉션프레임워크
- 스프링
- HTML
- 제네릭스
- 계산기만들기
- 알고리즘
- 페어프로그래밍
- 문자열뒤집기
- 백준알고리즘
- FilterChain
- java
Archives
- Today
- Total
나의 모양
[DailyCoding] 21 | largestProductOfThree 본문
✏️ 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