2의 영역

nacSeo (낙서)·2024년 2월 15일
0

프로그래머스

목록 보기
73/169

문제 설명

정수 배열 arr가 주어집니다. 배열 안의 2가 모두 포함된 가장 작은 연속된 부분 배열을 return 하는 solution 함수를 완성해 주세요.

단, arr에 2가 없는 경우 [-1]을 return 합니다.

제한사항

1 ≤ arr의 길이 ≤ 100,000
1 ≤ arr의 원소 ≤ 10

나의 코드

  • 첫 번째 코드
import java.util.*;

class Solution {
    public int[] solution(int[] arr) {
        List<Integer> list = new ArrayList<>();
        for(int i=0; i<arr.length; i++) {
            if(arr[i]==2) {
                list.add(arr[i]);
                for(int j=i+1; j<arr.length-i+1; j++) {
                    if(arr[j]==2) {
                        break;
                    }
                    list.add(arr[j]);
                }
            }
        }
        if(list.isEmpty()) {
            list.add(-1);
        }
        int[] answer = new int[list.size()];
        for(int k=0; k<list.size(); k++) {
            answer[k] = list.get(k);
        }
        return answer;
    }
}


4개 중에 3개 성공. arr의 원소에 2가 한 번만 나올 경우 에러가 발생

  • 두 번째 코드
import java.util.*;

class Solution {
    public int[] solution(int[] arr) {
        List<Integer> list = new ArrayList<>();
        for(int i=0; i<arr.length; i++) {
            if(arr[i]==2) {
                list.add(arr[i]);
                for(int j=i+1; j<arr.length-i+1; j++) {
                    if(arr[j]==2) {
                        break;
                    }
                    list.add(arr[j]);
                }
            }
        }
        if(list.isEmpty()) {
            list.add(-1);
        } else if(list.get(list.size()-1)!=2) {
            list.clear();
            list.add(2);
        }
        int[] answer = new int[list.size()];
        for(int k=0; k<list.size(); k++) {
            answer[k] = list.get(k);
        }
        return answer;
    }
}



코드 실행은 다 통과하였지만, 제출 후 채점하기에서 2개만 통과,, 통과하기에만 급급한 코드라 근본적인 문제를 해결하지 못했다.

  • 최종 코드
import java.util.*;

class Solution {
    public int[] solution(int[] arr) {
        int firstIndex = -1;
        int lastIndex = -1;
        for(int i=0; i<arr.length; i++) {
            if(arr[i]==2) {
                firstIndex = i;
                break;
            }
        }
        if(firstIndex != -1) {
            for(int j=firstIndex; j<arr.length; j++) {
                if(arr[j]==2) {
                    lastIndex = j;
                }
            }
        }
        List<Integer> list = new ArrayList<>();
        if(firstIndex == -1) {
            list.add(-1);
        } else if(firstIndex == lastIndex) {
            list.add(2);
        } else {
            for(int k=firstIndex; k<=lastIndex; k++) {
                list.add(arr[k]);
            }
        }
        int[] answer = new int[list.size()];
        for(int x=0; x<list.size(); x++) {
            answer[x] = list.get(x);
        }
        return answer;
    }
}

근본적인 문제 해결을 위해 초기화를 하고 코드를 새로 짰다.
상황은 3가지
1. 요소에 2가 없는 경우
2. 요소에 2가 1개일 경우
3. 요소에 2가 여러 개라 범위를 정할 수 있는 경우
3가지로 나누어 각각의 조건문을 통해 문제를 해결

느낀 점

처음에 사이값을 추가할 firstIndexlastIndex를 선언하고 반복문을 돌며 조건을 달아 해결하는 방법을 떠올리지 못했다. 문제 해결을 위한 하나하나 코드를 짜는 것보다 전체적인 틀을 짜서 문제를 해결하는 법을 길러야함을 뼈져리게 느낀다.

profile
백엔드 개발자 김창하입니다 🙇‍♂️

0개의 댓글