#  프로그래머스/Javascript : 기초 문제 12일차

- Author: @laetipark
- Published: 2024-03-17
- Updated: 2024-03-26
- Source: http://blex.me/@laetipark/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4javascript-%EA%B8%B0%EC%B4%88-%EB%AC%B8%EC%A0%9C-12%EC%9D%BC%EC%B0%A8
- Tags: 프로그래머스, 코딩테스트, 기초문제

---

## [리스트 자르기](https://school.programmers.co.kr/learn/courses/30/lessons/181897)

### 문제
정수 `n`과 정수 3개가 담긴 리스트 `slicer` 그리고 정수 여러 개가 담긴 리스트 `num_list`가 주어집니다. `slicer`에 담긴 정수를 차례대로 `a`, `b`, `c`라고 할 때, n에 따라 다음과 같이 `num_list`를 슬라이싱 하려고 합니다.

`n = 1` : `num_list`의 0번 인덱스부터 b번 인덱스까지
`n = 2` : `num_list`의 `a`번 인덱스부터 마지막 인덱스까지
`n = 3` : `num_list`의 `a`번 인덱스부터 `b`번 인덱스까지
`n = 4` : `num_list`의 `a`번 인덱스부터 `b`번 인덱스까지 `c` 간격으로
올바르게 슬라이싱한 리스트를 return하도록 solution 함수를 완성해주세요.

- 제한사항
	- `n` 은 1, 2, 3, 4 중 하나입니다.
	- `slicer`의 길이 = 3
	- `slicer`에 담긴 정수를 차례대로 `a`, `b`, `c`라고 할 때
		- 0 ≤ `a` ≤ `b` ≤ `num_list`의 길이 - 1
		- 1 ≤ `c` ≤ 3
	- 5 ≤ `num_list`의 길이 ≤ 30
	- 0 ≤ `num_list`의 원소 ≤ 100

### 소스 코드
```javascript
const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let n = '';
let slicer = [];
let num_list = [];
let count = 0;

rl.on('line', (line) => {
  if (count === 0) {
    n = Number(line);
  } else if (count === 1){
    slicer = line.split(' ').map(Number)
  } else {
    num_list = line.split(' ').map(Number);
  }
  count++;
  if (count > 2) {
    rl.close();
  }
}).on('close', () => {
  const answer = solution(n, slicer, num_list);
  console.log(answer);
});

const solution = (n, slicer, num_list) => {
  switch (n) {
    case 1:
      return num_list.slice(0, slicer[1]+1);
    case 2:
      return num_list.slice(slicer[0]);
    case 3:
      return num_list.slice(slicer[0], slicer[1]+1);
    case 4:
      const list = num_list.slice(slicer[0], slicer[1]+1);
      return list.filter((_, index) => index % slicer[2] === 0)
  }
};
```

## [첫 번째로 나오는 음수](https://school.programmers.co.kr/learn/courses/30/lessons/181896)

### 문제
정수 리스트 `num_list`가 주어질 때, 첫 번째로 나오는 음수의 인덱스를 return하도록 solution 함수를 완성해주세요. 음수가 없다면 -1을 return합니다.

- 제한사항
	- 5 ≤ `num_list`의 길이 ≤ 100
	- 10 ≤ `num_list`의 원소 ≤ 100

### 소스 코드
```javascript
const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = '';

rl.on('line', (line) => {
  input = line.split(' ').map(Number);
  rl.close();
}).on('close', () => {
  const answer = solution(input);
  console.log(answer);
});

const solution = (num_list) => {
  let count = 0;
  while (true) {
    if (num_list[count] < 0) {
      return count;
    }
    if (count > num_list.length) {
      return -1;
    }
    count++;
  }
};
```

## [배열 만들기 3](https://school.programmers.co.kr/learn/courses/30/lessons/181895)

### 문제
정수 배열 `arr`와 2개의 구간이 담긴 배열 `intervals`가 주어집니다.

`intervals`는 항상 `[[a1, b1], [a2, b2]]`의 꼴로 주어지며 각 구간은 닫힌 구간입니다. 닫힌 구간은 양 끝값과 그 사이의 값을 모두 포함하는 구간을 의미합니다.

이때 배열 `arr`의 첫 번째 구간에 해당하는 배열과 두 번째 구간에 해당하는 배열을 앞뒤로 붙여 새로운 배열을 만들어 return 하는 solution 함수를 완성해 주세요.

### 소스 코드
```javascript
const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let arr = [];
let intervals = [];
let count = 0;

rl.on('line', (line) => {
  if (count === 0) {
    arr = line.split(' ').map(Number);
  } else {
    intervals = line.split(' ').map(
      item => item.split(','),
    );
  }
  count++;
  if (count > 1) {
    rl.close();
  }
}).on('close', () => {
  const answer = solution(arr, intervals);
  console.log(answer);
});

const solution = (arr, intervals) => {
  let answer = [];
  intervals.map(interval => {
    answer.push(...arr.slice(interval[0], interval[1] + 1));
  });

  return answer;
};
```

## [배열 만들기 3](https://school.programmers.co.kr/learn/courses/30/lessons/181895)

### 문제
정수 배열 `arr`와 2개의 구간이 담긴 배열 `intervals`가 주어집니다.

`intervals`는 항상 `[[a1, b1], [a2, b2]]`의 꼴로 주어지며 각 구간은 닫힌 구간입니다. 닫힌 구간은 양 끝값과 그 사이의 값을 모두 포함하는 구간을 의미합니다.

이때 배열 `arr`의 첫 번째 구간에 해당하는 배열과 두 번째 구간에 해당하는 배열을 앞뒤로 붙여 새로운 배열을 만들어 return 하는 solution 함수를 완성해 주세요.

- 제한사항
	- 1 ≤ `arr`의 길이 ≤ 100,000
		- 1 ≤ `arr`의 원소 < 100
	- 1 ≤ `a1` ≤ `b1` < `arr`의 길이
	- 1 ≤ `a2` ≤ `b2` < `arr`의 길이

### 소스 코드
```javascript
const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let arr = [];
let intervals = [];
let count = 0;

rl.on('line', (line) => {
  if (count === 0) {
    arr = line.split(' ').map(Number);
  } else {
    intervals = line.split(' ').map(
      item => item.split(','),
    );
  }
  count++;
  if (count > 1) {
    rl.close();
  }
}).on('close', () => {
  const answer = solution(arr, intervals);
  console.log(answer);
});

const solution = (arr, intervals) => {
  let answer = [];
  intervals.map(interval => {
    answer.push(...arr.slice(interval[0], interval[1] + 1));
  });

  return answer;
};
```

## [2의 영역](https://school.programmers.co.kr/learn/courses/30/lessons/181894)

### 문제
정수 배열 `arr`가 주어집니다. 배열 안의 2가 모두 포함된 가장 작은 연속된 부분 배열을 return 하는 solution 함수를 완성해 주세요.

단, `arr`에 2가 없는 경우 [-1]을 return 합니다.

- 제한사항
	- 1 ≤ `arr`의 길이 ≤ 100,000
		- 1 ≤ `arr`의 원소 ≤ 10

### 소스 코드
```javascript
const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = '';

rl.on('line', (line) => {
  input = line.split(' ').map(Number);
  rl.close();
}).on('close', () => {
  const answer = solution(input);
  console.log(answer);
});

const solution = arr => {
  const start = arr.indexOf(2);
  if (start !== -1) {
    const end = (arr.reverse()).indexOf(2);

    return arr.reverse().slice(start, arr.length - end);
  }

  return [-1];
};
```

## [배열 조각하기](https://school.programmers.co.kr/learn/courses/30/lessons/181893)

### 문제
정수 배열 `arr`와 `query`가 주어집니다.

`query`를 순회하면서 다음 작업을 반복합니다.

짝수 인덱스에서는 `arr`에서 `query[i]`번 인덱스를 제외하고 배열의 `query[i]`번 인덱스 뒷부분을 잘라서 버립니다.
홀수 인덱스에서는 `arr`에서 `query[i]`번 인덱스는 제외하고 배열의 `query[i]`번 인덱스 앞부분을 잘라서 버립니다.
위 작업을 마친 후 남은 `arr`의 부분 배열을 return 하는 solution 함수를 완성해 주세요.

- 제한사항
	- 1 ≤ `arr`의 길이 ≤ 100,000
		- 1 ≤ `arr`의 원소 < 100
	- 1 ≤ `a1` ≤ `b1` < `arr`의 길이
	- 1 ≤ `a2` ≤ `b2` < `arr`의 길이

### 소스 코드
```javascript
const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let arr = [];
let query = [];
let count = 0;

rl.on('line', (line) => {
  if (count === 0) {
    arr = line.split(' ').map(Number);
  } else {
    query = line.split(' ').map(Number);
  }
  count++;
  if (count > 1) {
    rl.close();
  }
}).on('close', () => {
  const answer = solution(arr, query);
  console.log(answer);
});

const solution = (arr, query) => {
  let answer = arr;
  for (let i = 0; i < query.length; i++) {
    if (i % 2 === 0) {
      answer = answer.slice(0, query[i] + 1);
    } else {
      answer = answer.slice(query[i]);
    }
  }

  return answer;
};
```
