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

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

---

## [마지막 두 원소](https://school.programmers.co.kr/learn/courses/30/lessons/181927)

### 문제
정수 리스트 `num_list`가 주어질 때, 마지막 원소가 그전 원소보다 크면 마지막 원소에서 그전 원소를 뺀 값을 마지막 원소가 그전 원소보다 크지 않다면 마지막 원소를 두 배한 값을 추가하여 return하도록 solution 함수를 완성해주세요.

- 제한사항
	- 2 ≤ `num_list`의 길이 ≤ 10
	- 1 ≤ `num_list`의 원소 ≤ 9

### 소스 코드
```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 answer = num_list;
  const len = num_list.length;
  answer.push(num_list[len - 1] > num_list[len - 2] ? num_list[len - 1] - num_list[len - 2] : num_list[len - 1] * 2);
  return answer;
};
```

## [수 조작하기 1](https://school.programmers.co.kr/learn/courses/30/lessons/181926)

### 문제
정수 `n`과 문자열 `control`이 주어집니다. control은 "w", "a", "s", "d"의 4개의 문자로 이루어져 있으며, `control`의 앞에서부터 순서대로 문자에 따라 `n`의 값을 바꿉니다.

"w" : `n`이 1 커집니다.
"s" : `n`이 1 작아집니다.
"d" : `n`이 10 커집니다.
"a" : `n`이 10 작아집니다.
위 규칙에 따라 `n`을 바꿨을 때 가장 마지막에 나오는 `n`의 값을 return 하는 solution 함수를 완성해 주세요.

- 제한사항
	- 100,000 ≤ `n` ≤ 100,000
	- 1 ≤ `control`의 길이 ≤ 100,000
		- `control`은 알파벳 소문자 "w", "a", "s", "d"로 이루어진 문자열입니다.

### 소스 코드
```javascript
const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let number = 0;
let input = '';
let count = 0;

rl.on('line', (line) => {
  if (count === 0) {
    number = Number(line);
  } else {
    input = line;
  }
  count++;
  if (count > 1) {
    rl.close();
  }
}).on('close', () => {
  const answer = solution(number, input);
  console.log(answer);
});

const solution = (n, control) => {
  let answer = n;
  const strArray = control.split('');
  strArray.map(item => {
    if (item === 'w') {
      answer += 1;
    } else if (item === 's') {
      answer -= 1;
    } else if (item === 'd') {
      answer += 10;
    } else if (item === 'a') {
      answer -= 10;
    }
  });

  return answer;
};
```

## [수 조작하기 2](https://school.programmers.co.kr/learn/courses/30/lessons/181925)

### 문제
정수 배열 `numLog`가 주어집니다. 처음에 `numLog[0]`에서 부터 시작해 "w", "a", "s", "d"로 이루어진 문자열을 입력으로 받아 순서대로 다음과 같은 조작을 했다고 합시다.

"w" : 수에 1을 더한다.
"s" : 수에 1을 뺀다.
"d" : 수에 10을 더한다.
"a" : 수에 10을 뺀다.
그리고 매번 조작을 할 때마다 결괏값을 기록한 정수 배열이 `numLog`입니다. 즉, `numLog[i]`는 `numLog[0]`로부터 총 `i`번의 조작을 가한 결과가 저장되어 있습니다.

주어진 정수 배열 `numLog`에 대해 조작을 위해 입력받은 문자열을 return 하는 solution 함수를 완성해 주세요.

- 제한사항
	- 2 ≤ `numLog`의 길이 ≤ 100,000
		- 100,000 ≤ `numLog[0]` ≤ 100,000
		- 1 ≤ `i` ≤ `numLog`의 길이인 모든 `i`에 대해 `|numLog[i] - numLog[i - 1]|`의 값은 1 또는 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 = (numLog) => {
  let answer = '';
  for (let i = 1; i < numLog.length; i++) {
    const currNum = numLog[i];
    const prevNum = numLog[i - 1];
    if (currNum - prevNum === 1) {
      answer += 'w';
    } else if (currNum - prevNum === -1) {
      answer += 's';
    } else if (currNum - prevNum === 10) {
      answer += 'd';
    } else if (currNum - prevNum === -10) {
      answer += 'a';
    }
  }

  return answer;
};
```

## [수열과 구간 쿼리 3](https://school.programmers.co.kr/learn/courses/30/lessons/181924)

### 문제
정수 배열 `arr`와 2차원 정수 배열 `queries`이 주어집니다. `queries`의 원소는 각각 하나의 `query`를 나타내며, `[i, j]` 꼴입니다.

각 `query`마다 순서대로 `arr[i]`의 값과 `arr[j]`의 값을 서로 바꿉니다.

위 규칙에 따라 `queries`를 처리한 이후의 `arr`를 return 하는 solution 함수를 완성해 주세요.

- 제한사항
	- 1 ≤ `arr`의 길이 ≤ 1,000
		- 0 ≤ `arr`의 원소 ≤ 1,000,000
	- 1 ≤ `queries`의 길이 ≤ 1,000
		- 0 ≤ `i` < `j` < `arr`의 길이

### 소스 코드
```javascript
const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = '';
let queries = '';
let count = 0;

rl.on('line', (line) => {
  if (count === 0) {
    input = line.split(' ').map(Number);
  } else {
    queries = line.split(' ');
    queries = queries.map(item => {
      return item.split('');
    });
  }
  count++;
  if (count > 1) {
    rl.close();
  }
}).on('close', () => {
  const answer = solution(input, queries);
  console.log(answer);
});

const solution = (arr, queries) => {
  queries.map(item => {
    let temp;
    temp = arr[Number(item[0])];
    arr[Number(item[0])] = arr[Number(item[1])];
    arr[Number(item[1])] = temp;
  });

  return arr;
};
```

## [수열과 구간 쿼리 2](https://school.programmers.co.kr/learn/courses/30/lessons/181923)

### 문제
정수 배열 `arr`와 2차원 정수 배열 `queries`이 주어집니다. `queries`의 원소는 각각 하나의 `query`를 나타내며, `[s, e, k]` 꼴입니다.

각 `query`마다 순서대로 `s` ≤ `i` ≤ `e`인 모든 `i`에 대해 `k`보다 크면서 가장 작은 `arr[i]`를 찾습니다.

각 쿼리의 순서에 맞게 답을 저장한 배열을 반환하는 solution 함수를 완성해 주세요.
단, 특정 쿼리의 답이 존재하지 않으면 -1을 저장합니다.

- 제한사항
	- 1 ≤ `arr`의 길이 ≤ 1,000
		- 0 ≤ `arr`의 원소 ≤ 1,000,000
	- 1 ≤ `queries`의 길이 ≤ 1,000
		- 0 ≤ `s` ≤ `e` < `arr`의 길이
		- 0 ≤ `k` ≤ 1,000,000

### 소스 코드
```javascript
const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = '';
let queries = '';
let count = 0;

rl.on('line', (line) => {
  if (count === 0) {
    input = line.split(' ').map(Number);
  } else {
    queries = line.split(' ');
    queries = queries.map(item => {
      return item.split('').map(Number);
    });
  }
  count++;
  if (count > 1) {
    rl.close();
  }
}).on('close', () => {
  const answer = solution(input, queries);
  console.log(answer);
});

const solution = (arr, queries) => {
  let answer = [];
  for (let i = 0; i < queries.length; i++) {
    const item = queries[i];
    const temp = arr.slice(item[0], item[1] + 1);
    answer.push((temp.filter(num => item[2] < num)).sort((a, b) => a - b)[0] || -1);
  }

  return answer;
};
```
