연습장

51. 2의 영역 본문

프로그래머스/0단계

51. 2의 영역

js0616 2023. 7. 10. 21:14

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

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

 


경우의 수가 여러개라서 생각을 잘해야 풀 수 있다.

 

1) 2가 없는경우 - 예시의 3번이며  -1 을 retrun 한다. 

2) 2가 1개인 경우 - 예시의 2번이며 2 를 return 한다.

3) 2가 2개인 경우 - 예시의 1번이며 2부터 2까지 모두 slice 해서 return 한다.

4) 2가 3개 이상인  경우 - 예시의 4번이며 처음 2 부터 마지막 2까지 모두 slice 해서 return 한다. 

 

각각의 케이스를 하나씩 고려하기 보다는

문제를 잘 정리하면서 공통된것을 찾아서 없애며 푸는게 중요하다. 

여기서 중요한건 처음 나오는 2 와 마지막에 나오는 2를 찾는게 중요하다. 

 

처음 나오는 2의 인덱스를 Start 라 하고

마지막 나오는 2의 인덱스를 End 라 하면

 

Start 부터 End 까지 slice 하면 3, 4 번을 동시에 해결 할 수있다. 

2가 몇개가 더나오든 4번의 Start 와 End 에는 영향을 주지 않음 . 

 

그리고 Start 와 End 가 같은경우 -> 즉 두 인덱스가 같은경우 -> 2가 1개인 경우이다. -> 2번 을 해결할수있다.

마지막으로 Start 와 End 가 없는경우 -> 즉 2가 없는 경우 (undefined) 로 -> 1번을 해결 할 수있다. 

 

각각 Start 와 End 값을 찾는 함수를 정의하고

 

본 문제에 적용하였다. 

 

        // 시작값
        const Start = (arr) => {
            for (let i = 0; i < arr.length; i++) {
                if (arr[i] == 2) {
                    return i
                }
            }
        }
        // 끝 값
        const End = (arr) => {
            for (let i = arr.length - 1; i >= 0; i--) {
                if (arr[i] == 2) {
                    return i
                }
            }
        }

        function solution(arr) {
            var answer = [];

            if (Start(arr) == undefined) {
                answer.push(-1)
            }
            else if (Start(arr) == End(arr)) {
                answer.push(2)
            }
            else {
                answer = arr.slice(Start(arr), End(arr) + 1)
            }

            return answer
        }

'프로그래머스 > 0단계' 카테고리의 다른 글

53. 왼쪽 오른쪽  (0) 2023.07.10
52. 배열 조각하기  (0) 2023.07.10
50. 리스트 자르기  (0) 2023.07.10
49. 문자개수 세기  (0) 2023.07.10
48. 세로 읽기  (0) 2023.07.10