코딩테스트 - 프로그래머스/Lv. 0

[80] JAVA 마지막 두 원소

유혁스쿨 2023. 11. 29. 20:53
728x90
반응형

문제 설명

정수 리스트 num_list가 주어질 때, 마지막 원소가 그전 원소보다 크면 마지막 원소에서 그전 원소를 뺀 값을 마지막 원소가 그전 원소보다 크지 않다면 마지막 원소를 두 배한 값을 추가하여 return하도록 solution 함수를 완성해주세요.


제한사항
  • 2 ≤ num_list의 길이 ≤ 10
  • 1 ≤ num_list의 원소 ≤ 9

입출력 예
num_list result
[2, 1, 6] [2, 1, 6, 5]
[5, 2, 1, 7, 5] [5, 2, 1, 7, 5, 10]

 

입출력 예 #1

  • 마지막 원소인 6이 그전 원소인 1보다 크기 때문에 6 - 1인 5를 추가해 return합니다.

입출력 예 #2

  • 마지막 원소인 5가 그전 원소인 7보다 크지 않기 때문에 5의 두 배인 10을 추가해 return합니다.

[나의 풀이]

import java.util.Arrays;

class Solution {
	public int[] solution(int[] num_list) {
    	int [] arr = Arrays.copyOf(num_list.length, num_list.length + 1);
        arr[num_list.length] = (num_list[num_list.length-1] > num_list[num_list.length-2]) ?
     (num_list[num_list.length-1] - num_list[num_list.length-2]) : (num_list[num_list.length-1] * 2);

    	return arr;
    }
}

조건을 만족하는 값으로 배열의 마지막 요소에 값을 추가하는 초기화 작업을 해야하는데,
배열 요소를 추가할때 길이가 맞지 않기 때문에 깊은복사를 하는 방식인 Arrays.copyOf() 메소드를 활용하였다.

매개변수 첫번째 인자는 원본 배열, 두번째 인자는 복사할 길이를 입력한다.

우리는 원본 배열에 요소 1개를 더 추가해야 하기 때문에 원본배열의 길이에 1을 더한 값으로 배열 길이를 지정한다.

이후 조건문을 통해 마지막 인덱스 요소에 조건에 맞는 값을 추가한다.

 

[다른 풀이]

import java.util.stream.IntStream;

class Solution {
	public int[] solution(int[] num_list) {
    	return IntStream.iterate(0, i -> i+1).limit(num_list.length + 1)
        .map(i -> i == num_list.length ? (num_list[i-1] > num_list[i-2] ? num_list[i-1] - num_list[i-2] : num_list[i-1] * 2) : num_list[i])
        .toArray();
    }
}

IntStream의 iterate() 메소드를 사용한게 보인다.

 

1. iterate() 메소드는 어떤 연산을 반복적으로 수행할 때 사용한다.

첫번째 매개변수 인자값은 초기값이고, 두번째 인자값은 값이 변경될지 나타내는 람다식이 온다.

따라서 값이 0부터 시작해서 1씩 증가하는 스트림이 된다.

 

2. limit() 메소드에 의해 값의 범위를 지정한다.

범위는 배열길이보다 1만큼 긴 값을 반환한다.

2,1,6 의 경우 길이가 3 이므로 3+1=4 즉, 0부터 시작하여 4의 범위까지 0, 1, 2, 3이 된다.

 

3. map함수를 통해 해당 값을 index로 사용한다.

index가 배열의 길이와 일치한다면 조건을 실행하고 일치하지 않는다면 해당 인덱스를 그대로 사용하여 반환한다.

순차적으로 반환한 뒤 배열의 길이와 일치할때 내부적으로 마지막 요소와 마지막 이전요소를 비교하는 식을 적용한다.

 

 

앞의 1번과 1번 iterate, limit메소드는 range() 메소드와 동일하므로 아래와 같이 적용할 수도 있다.

import java.util.stream.IntStream;

class Solution {
	public int[] solution(int[] num_list) {
    	return IntStream.rangeClosed(0, num_list.length)
        .map(i -> i == num_list.length ? (num_list[i-1] > num_list[i-2] ? num_list[i-1] - num_list[i-2] : num_list[i-1] * 2) : num_list[i])
        .toArray();
    }
}
728x90
반응형