2의 영역 JAVA 프로그래머스 코딩테스트
2의 영역 JAVA
출처 : https://school.programmers.co.kr/learn/courses/30/lessons/181894
문제설명 : 정수 배열 arr가 주어집니다. 배열 안의 2가 모두 포함된 가장 작은 연속된 부분 배열을 return 하는 solution 함수를 완성해 주세요. 단, arr에 2가 없는 경우 [-1]을 return 합니다
내가 작성한 코드 :
import java.util.*;
class Solution {
public List<Integer> solution(int[] arr) {
List<Integer> answer = new ArrayList<>();
List<Integer> indexGroup = new ArrayList<>();
for(int i=0; i<arr.length; i++){
if(arr[i] == 2){ indexGroup.add(i); }
}
if(indexGroup.size() == 0){
answer.add(-1);
} else if( indexGroup.size() == 1 && indexGroup.get(0) != 0 ){
if(indexGroup.get(0) != -1){ answer.add(arr[indexGroup.get(0)]); }
} else {
for( int i=indexGroup.get(0); i<= indexGroup.get(indexGroup.size()-1) ; i++ ){
answer.add(arr[i]);
}
}
return answer;
}
}
전체적으로 흐름은.. 빨리 잡은 편인데. 치명적인 실수를 했다!
첫번째 for문을 돌고 나와서 indexGroup.size()가 0일 때, -1을 넣어주는 부분에... anwer에다가 넣어야 되는데, 코드를 쓰다가 딴생각을 한건지 indexGroup에다가 add를 하고 자빠져서 테스트케이스 3번일 때, 자꾸 빈값으로 나왔는데.. 이걸 못찾아서 30분가까이 허비함.. 하핫...
내가 작성한 코드라도... 의아하게 뭐가 잘 안될때는 변수 이름을 잘 읽어보자!!!!! ㅠㅠ
내가 작성한 코드를 인공지능 뤼튼에게 간결하고 효율적으로 변경해달라고 부탁했다.
뤼튼의 답변 : 코드의 복잡성을 줄이고 가독성을 향상시키는 방향으로 최적화하였어요.
### 코드 최적화 포인트
- **중복 검사 제거**: 배열을 순회하며 값이 2인 인덱스를 찾고, 특정 조건에 맞추어 결과를 저장하는 로직이 있어요. 이 중 일부 조건 검사는 불필요하므로 제거할 수 있어요.
- **스트림 사용 고려**: Java 8 이상을 사용한다면 `Stream API`를 활용할 수 있어요. 특히 값이 2인 요소만 필터링하거나 특정 조건에 맞는 요소를 찾는 작업에 유용해요
[1] 링크 : https://granulate.io/blog/java-optimization-5-essential-techniques-tools-that-can-help/
[2] 링크 : https://www.tutorialspoint.com/12-tips-to-optimize-java-code-performance
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
class Solution {
public List<Integer> solution(int[] arr) {
// 값 '2'를 찾은 인덱스를 스트림을 통해 리스트로 저장
List<Integer> indexGroup = IntStream.range(0, arr.length)
.filter(i -> arr[i] == 2)
.boxed()
.collect(Collectors.toList());
if (indexGroup.isEmpty()) {
return Collections.singletonList(-1);
}
// 첫 번째와 마지막 인덱스 사이의 값을 추출
return IntStream.rangeClosed(indexGroup.get(0), indexGroup.get(indexGroup.size() - 1))
.mapToObj(i -> arr[i])
.collect(Collectors.toList());
}
}
- **스트림 사용**: `IntStream`과 `filter`, `boxed`, `collect`를 통해 더 간결하게 인덱스를 찾습니다.
- **간소화된 조건문**: `isEmpty`를 사용하여 빈 리스트를 더욱 명확하게 확인합니다.
- **`rangeClosed` 메소드 활용**: 첫 번째 인덱스부터 마지막 인덱스까지의 값을 효과적으로 추출합니다.