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

- Author: @laetipark
- Published: 2024-04-07
- Updated: 2024-04-07
- 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-19%EC%9D%BC%EC%B0%A8
- Tags: 프로그래머스, 코딩테스트, 기초문제

---

## [세 개의 구분자](https://school.programmers.co.kr/learn/courses/30/lessons/181862)

### 문제
임의의 문자열이 주어졌을 때 문자 "a", "b", "c"를 구분자로 사용해 문자열을 나누고자 합니다.

예를 들어 주어진 문자열이 "baconlettucetomato"라면 나눠진 문자열 목록은 ["onlettu", "etom", "to"] 가 됩니다.

문자열 `myStr`이 주어졌을 때 위 예시와 같이 "a", "b", "c"를 사용해 나눠진 문자열을 순서대로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.

단, 두 구분자 사이에 다른 문자가 없을 경우에는 아무것도 저장하지 않으며, return할 배열이 빈 배열이라면 ["EMPTY"]를 return 합니다.

- 제한사항
	- 1 ≤ `myStr`의 길이 ≤ 1,000,000
		- `myStr`은 알파벳 소문자로 이루어진 문자열 입니다.

### 소스 코드
```javascript
const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let myStr = [];

rl.on('line', (line) => {
  myStr = line.split(' ').map(Number);
  rl.close();
}).on('close', () => {
  const answer = solution(myStr);
  console.log(answer);
});

const solution = myStr => {
  let answer = [];
  let str = '';
  for (let i = 0; i < myStr.length; i++) {
    if (!['a', 'b', 'c'].includes(myStr[i])) {
      str += myStr[i];
    } else {
      if (str !== '') {
        answer.push(str);
      }
      str = '';
    }
  }
  if (str !== '') {
    answer.push(str);
  }

  return answer.length === 0 ? ["EMPTY"] : answer;
};
```

## [배열의 원소만큼 추가하기](https://school.programmers.co.kr/learn/courses/30/lessons/181861)

### 문제
아무 원소도 들어있지 않은 빈 배열 X가 있습니다. 양의 정수 배열 `arr`가 매개변수로 주어질 때, `arr`의 앞에서부터 차례대로 원소를 보면서 원소가 a라면 X의 맨 뒤에 a를 a번 추가하는 일을 반복한 뒤의 배열 X를 return 하는 solution 함수를 작성해 주세요.

- 제한사항
	- 1 ≤ `arr`의 길이 ≤ 100
	- 1 ≤ `arr`의 원소 ≤ 100

### 소스 코드
```javascript
const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let arr = [];

rl.on('line', (line) => {
  arr = line.split(' ').map(Number);
  rl.close();
}).on('close', () => {
  const answer = solution(arr);
  console.log(answer);
});

const solution = arr => {
  let answer = [];
  for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < arr[i]; j++) {
      answer.push(arr[i]);
    }
  }
  return answer;
};
```

## [빈 배열에 추가, 삭제하기](https://school.programmers.co.kr/learn/courses/30/lessons/181860)

### 문제
아무 원소도 들어있지 않은 빈 배열 X가 있습니다. 길이가 같은 정수 배열 `arr`과 boolean 배열 `flag`가 매개변수로 주어질 때, `flag`를 차례대로 순회하며 `flag[i]`가 true라면 X의 뒤에 `arr[i]`를 `arr[i]` × 2 번 추가하고, `flag[i]`가 false라면 X에서 마지막 `arr[i]`개의 원소를 제거한 뒤 X를 return 하는 solution 함수를 작성해 주세요.

- 제한사항
	- 1 ≤ `arr`의 길이 = `flag`의 길이 ≤ 100
	- `arr`의 모든 원소는 1 이상 9 이하의 정수입니다.
	- 현재 X의 길이보다 더 많은 원소를 빼는 입력은 주어지지 않습니다.

### 소스 코드
```javascript
const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let arr = [];
let flag = [];
let count = 0;

rl.on('line', (line) => {
  if (count === 0) {
    arr = line.split(' ').map(Number);
  } else {
    flag = line.split(' ').map(Number).map(item => item === 1);
  }
  count++;
  if (count > 1) {
    rl.close();
  }
}).on('close', () => {
  const answer = solution(arr, flag);
  console.log(answer);
});

const solution = (arr, flag) => {
  let answer = [];
  for (let i = 0; i < arr.length; i++) {
    if (flag[i]) {
       for (let j = 0; j < arr[i] * 2; j++) {
         answer.push(arr[i]);
       }
    } else {
      answer.splice(answer.length - arr[i], answer.length);
    }
  }

  return answer;
};
```

## [배열 만들기 6](https://school.programmers.co.kr/learn/courses/30/lessons/181859)

### 문제
0과 1로만 이루어진 정수 배열 `arr`가 주어집니다. `arr`를 이용해 새로운 배열 `stk`을 만드려고 합니다.

`i`의 초기값을 0으로 설정하고 `i`가 `arr`의 길이보다 작으면 다음을 반복합니다.

만약 `stk`이 빈 배열이라면 `arr[i]`를 `stk`에 추가하고 `i`에 1을 더합니다.
`stk`에 원소가 있고, `stk`의 마지막 원소가 `arr[i]`와 같으면 `stk`의 마지막 원소를 `stk`에서 제거하고 `i`에 1을 더합니다.
`stk`에 원소가 있는데 `stk`의 마지막 원소가 `arr[i]`와 다르면 `stk`의 맨 마지막에 `arr[i]`를 추가하고 `i`에 1을 더합니다.
위 작업을 마친 후 만들어진 `stk`을 return 하는 solution 함수를 완성해 주세요.

단, 만약 빈 배열을 return 해야한다면 [-1]을 return 합니다.

- 제한사항
	- 1 ≤ `arr`의 길이 ≤ 1,000,000
		- `arr`의 원소는 0 또는 1 입니다.

### 소스 코드
```javascript
const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let arr = [];

rl.on('line', (line) => {
  arr = line.split(' ').map(Number);
  rl.close();
}).on('close', () => {
  const answer = solution(arr);
  console.log(answer);
});

const solution = arr => {
  let answer = [arr[0]];
  let number = arr[0];
  for (let i = 1; i < arr.length; i++) {
    if (answer[answer.length - 1] !== arr[i]) {
      answer.push(arr[i]);
    } else {
      answer.splice(answer.length - 1, answer.length);
    }

    number = arr[i];
  }

  return answer.length === 0 ? [-1] : answer;
};
```

## [무작위로 K개의 수 뽑기](https://school.programmers.co.kr/learn/courses/30/lessons/181858)

### 문제
랜덤으로 서로 다른 `k`개의 수를 저장한 배열을 만드려고 합니다. 적절한 방법이 떠오르지 않기 때문에 일정한 범위 내에서 무작위로 수를 뽑은 후, 지금까지 나온적이 없는 수이면 배열 맨 뒤에 추가하는 방식으로 만들기로 합니다.

이미 어떤 수가 무작위로 주어질지 알고 있다고 가정하고, 실제 만들어질 길이 `k`의 배열을 예상해봅시다.

정수 배열 `arr`가 주어집니다. 문제에서의 무작위의 수는 `arr`에 저장된 순서대로 주어질 예정이라고 했을 때, 완성될 배열을 return 하는 solution 함수를 완성해 주세요.

단, 완성될 배열의 길이가 k보다 작으면 나머지 값을 전부 -1로 채워서 return 합니다.

- 제한사항
	- 1 ≤ `arr`의 길이 ≤ 100,000
		- 0 ≤ `arr`의 원소 ≤ 100,000
	- 1 ≤ `k` ≤ 1,000

### 소스 코드
```javascript
const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let arr = [];
let k = 0;
let count = 0;

rl.on('line', (line) => {
  if (count === 0) {
    arr = line.split(' ').map(Number);
  } else {
    k = Number(line);
  }
  count++;
  if (count > 1) {
    rl.close();
  }
}).on('close', () => {
  const answer = solution(arr, k);
  console.log(answer);
});

const solution = (arr, k) => {
  let answer = [];
  let set = [...new Set(arr)];

  for (let i = 0; i < k; i++) {
    if (set[i] !== undefined) {
      answer.push(set[i]);
    } else {
      answer.push(-1);
    }
  }

  return answer;
};
```
