탄탄대로
[Level 1] 평균 구하기 본문
- 쉬우니까 Stream을 활용해보았다!
문제
"정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요."
입출력 예
arr | return |
[1,2,3,4] | 2.5 |
[5,5] | 5 |
풀이
class Solution {
public double solution(int[] arr) {
double answer = 0;
double sum = 0;
for(int i = 0; i < arr.length; i++){
sum += arr[i];
}
answer = sum / arr.length;
return answer;
}
}
for문으로 풀어보았다.
처음에 배열의 합계 변수인 sum을 int 타입으로 설정한 뒤 테스트를 했더니 소수점을 버리고 정수만 리턴했다.
그래서 sum 변수를 double 타입으로 변경했다.
다른 풀이
class Solution {
public double solution(int[] arr){
double sum = Arrays.stream(arr).sum();
return sum / arr.length;
}
}
Stream의 sum()을 사용해서 합계를 구한 풀이.
import java.util.Arrays;
class Solution {
public double solution(int[] arr){
return Arrays.stream(arr).average().orElse(0);
}
}
Stream의 average()를 사용해서 평균을 구한 풀이.
※ OptionalDouble의 getAsDouble()을 사용해도 된다.
Java에서 나누기
Java에서 숫자를 나누면 소수점 값이 안나오는 경우가 있다.
리턴값을 double로 받아도 int 타입과 long 타입은 나누기를 하면 소수점을 버리고 정수만 리턴한다.
public static void main(String[] args){
int i1 = 100 / 3;
double d = 100 / 3;
int i2 = (int)(100.0 / 3);
System.out.println("i1 = "+ i1);
System.out.println("-------------");
System.out.println("d = "+ d);
System.out.println("-------------");
System.out.println("i2 = "+ i2);
}
소수점을 정상적으로 출력하기 위해서는 리턴값을 double 타입으로 설정하고 어느 숫자이든 하나만 실수형이면 된다.
public static void main(String[] args){
double i3 = 100.0 / 3.0;
double d1 = 100.0 / 3;
double i4 = 100 / (double)3;
System.out.println("i3 = "+ i3);
System.out.println("-------------");
System.out.println("d1 = "+ d1);
System.out.println("-------------");
System.out.println("i4 = "+ i4);
}
Arrays.stream()
리턴 | 설명 |
static DoubleStream | stream(double[] array)
지정된 배열을 소스로 사용하여 순차적인 DoubleStream을 반환합니다.
|
static IntStream | stream(int[] array)
지정된 배열을 소스로 사용하여 순차적인 IntStream을 반환합니다.
|
static LongStream | stream(long[] array)
지정된 배열을 소스로 사용하여 순차적인 LongStream을 반환합니다.
|
Stream.sum()
리턴 | 설명 |
double | sum()
이 스트림에 있는 요소의 합계를 반환합니다.
|
Stream.average()
리턴 | 설명 |
OptionalDouble | average()
이 스트림 요소의 산술 평균 OptionalDouble을 반환하거나, 이 스트림이 비어 있으면 빈 옵션을 반환합니다.
|
OptionalDouble
java.lang.Object
java.util.OptionalDouble
A container object which may or may not contain a double value.
double 값을 가지고 있는지 아닌지를 나타내는 컨테이너 객체입니다.
API Note:Optional is primarily intended for use as a method return type where there is a clear need to represent “no result,” and where using null is likely to cause errors. A variable whose type is Optional should never itself be null; it should always point to an Optional instance.
메서드가 반환할 결과값이 ‘없음’을 명백하게 표현할 필요가 있고, null을 반환하면 에러를 유발할 가능성이 높은 상황에서 메서드의 반환 타입으로 Optional을 사용하자는 것이 Optional을 만든 주된 목적이다. Optional 타입의 변수의 값은 절대 null이어서는 안 되며, 항상 Optional 인스턴스를 가리켜야 한다.
[출처: https://homoefficio.github.io/2019/10/03/Java-Optional-%EB%B0%94%EB%A5%B4%EA%B2%8C-%EC%93%B0%EA%B8%B0/]
OptionalDouble.orElse()
리턴 | 설명 |
double | orElse(double other)
값이 있으면 반환하고 그렇지 않으면 other을 반환합니다.
|
OptionalDouble.getAsDouble()
리턴 | 설명 |
double | getAsDouble()
이 OptionalDouble에 값이 있으면 값을 반환하고, 그렇지 않으면 NoSuchElementException을 던집니다.
|
참고
- https://hianna.tistory.com/553
- https://mainia.tistory.com/2020
문제 출처
- 프로그래머스
'코딩테스트' 카테고리의 다른 글
[Level 1] 제일 작은 수 제거하기 (0) | 2022.07.19 |
---|---|
[Level 1] 콜라츠 추측 (0) | 2022.07.19 |
[Level 1] 하샤드 수 (0) | 2022.07.13 |
[Level 1] 핸드폰 번호 가리기 (0) | 2022.07.12 |
[Level 1]행렬의 덧셈 (0) | 2022.07.08 |