코딩테스트

2의 영역 JAVA 프로그래머스 코딩테스트

daeyun대윤 2024. 3. 9. 07:03

 

2의 영역 JAVA 

 

출처 : https://school.programmers.co.kr/learn/courses/30/lessons/181894

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

문제설명 : 정수 배열 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` 메소드 활용**: 첫 번째 인덱스부터 마지막 인덱스까지의 값을 효과적으로 추출합니다.

 

728x90
300x250