16일차

16일차까지 풀고 87% 달성 및 16문제가 남았다. 4일 동안 4문제씩 풀면 된다. 주말에도 깨작깨작 문제도 보고, 풀어도 보면서 계속 코딩에 대한 감각을 익히고 기르는 것이 매우 중요한 것 같다.
오늘의 문제
2의 영역
정수 배열 arr가 주어집니다. 배열 안의 2가 모두 포함된 가장 작은 연속된 부분 배열을 return 하는 solution 함수를 완성해 주세요.
단, arr에 2가 없는 경우 [-1]을 return 합니다.
예시
| arr | result |
|---|
| [1, 2, 1, 4, 5, 2, 9] | [2, 1, 4, 5, 2] |
| [1, 2, 1] | [2] |
| [1, 1, 1] | [-1] |
| [1, 2, 1, 2, 1, 10, 2, 1] | [2, 1, 2, 1, 10, 2] |
이 문제를 선택한 이유는 인덱스 때문이다. 문제를 풀 때 어떻게 풀어야 할까 고민을 하다가, 인덱스가 불연듯 떠올랐기 때문이다. 배열에서 가장 중요한 부분 중 하나가 인덱스인데 이를 순간 잊고 있었다는 사실에 이 문제를 선택했다.
접근방법
문제는 arr에서 2가 모두 포함된 가장 작은 연속된 부분 배열을 찾아야한다. 그래서 가장 큰 핵심은 index다.
- 배열 arr을 순회하면서 2가 등장하는 첫 번째 인덱스와 마지막 인덱스를 찾기. 2가 등장하지 않으면 [-1]을 반환.
- startIdx와 endIdx를 사용하여 arr에서 해당 부분 배열을 추출.
- 추출한 부분 배열을 반환.
이러한 문제의 접근방법으로 문제를 풀었다.
풀이
function solution(arr) {
const startIdx = arr.indexOf(2);
const endIdx = arr.lastIndexOf(2);
if (startIdx === -1 || endIdx === -1) {
return [-1];
}
const result = arr.slice(startIdx, endIdx + 1);
return result;
}
처음에 나오는 변수는, 첫 번째로 2가 나오는 인덱스와 마지막으로 2가 나오는 인덱스를 찾는 것이다.
다음 조건문을 통해 없으면 -1을 반환한다. 참고로 indexOf()와 lastIndexOf()는 배열에서 반환값이 없을 경우 -1을 반환한다.
마지막으로 첫 번째 2의 인덱스와 마지막의 2의 인덱스를 통해 arr를 잘라 result에 넣어주면 된다.
정리하기
다시 한 주의 시작이다. 첫 날은 한 주를 위해 잠들어 있던 머리를 깨우는 날이기 때문에 오늘 같이 가벼운 문제로 한 주를 시작해보았다. 이번 주가 코딩 기초트레이닝의 마지막이니까 착실하게 끝내보도록 해보자.