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

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

---

## [덧셈식 출력하기](https://school.programmers.co.kr/learn/courses/30/lessons/181947)

### 문제
두 정수 `a`, `b`가 주어질 때 다음과 같은 형태의 계산식을 출력하는 코드를 작성해 보세요.
`a + b = c`
- 제한사항
	- 1 ≤ `a`, `b` ≤ 100

### 소스 코드
```javascript
const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

let input = [];

rl.on('line', function (line) {
    input = line.split(' ').map(Number);
}).on('close', function () {
    console.log(`${input[0]} + ${input[1]} = ${input[0] + input[1]}`);
});
```

## [문자열 붙여서 출력하기](https://school.programmers.co.kr/learn/courses/30/lessons/181946)

### 문제
두 개의 문자열 `str1`, `str2`가 공백으로 구분되어 입력으로 주어집니다.
입출력 예와 같이 `str1`과 `str2`을 이어서 출력하는 코드를 작성해 보세요.

- 제한사항
	- 1 ≤ `str1`, `str2`의 길이 ≤ 10

### 소스 코드
```javascript
const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

let input = [];

rl.on('line', function (line) {
    input = line.split(' ');
}).on('close', function () {
  console.log(`${input[0]}${input[1]}`);
});
```

## [문자열 돌리기](https://school.programmers.co.kr/learn/courses/30/lessons/181945)

### 문제
문자열 `str`이 주어집니다.
문자열을 시계방향으로 90도 돌려서 아래 입출력 예와 같이 출력하는 코드를 작성해 보세요.

- 제한사항
	- 1 ≤ `str`의 길이 ≤ 10

### 소스 코드
```javascript
const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

let input = [];

rl.on('line', function (line) {
    input = [line];
}).on('close',function(){
  str = input[0];
  for (let i = 0; i < str.length; i++) console.log(str[i]);
});
```

## [홀짝 구분하기](https://school.programmers.co.kr/learn/courses/30/lessons/181944)

### 문제
자연수 `n`이 입력으로 주어졌을 때 만약 `n`이 짝수이면 "`n` is even"을, 홀수이면 "`n` is odd"를 출력하는 코드를 작성해 보세요.

- 제한사항
	- 1 ≤ `n` ≤ 1,000

### 소스 코드
```javascript
const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

let input = [];

rl.on('line', function (line) {
    input = line.split(' ');
}).on('close', function () {
  n = Number(input[0]);
  console.log(`${n} is ${n % 2 === 0 ? 'even' : 'odd'}`);
});
```

## [문자열 겹쳐쓰기](https://school.programmers.co.kr/learn/courses/30/lessons/181943)

### 문제
문자열 `my_string`, `overwrite_string`과 정수 `s`가 주어집니다. 문자열 `my_string`의 인덱스 `s`부터 `overwrite_string`의 길이만큼을 문자열 `overwrite_string`으로 바꾼 문자열을 return 하는 solution 함수를 작성해 주세요.

- `my_string`와 `overwrite_string`은 숫자와 알파벳으로 이루어져 있습니다.
- 1 ≤ `overwrite_string`의 길이 ≤ `my_string`의 길이 ≤ 1,000
- 0 ≤ `s` ≤ `my_string`의 길이 - `overwrite_string`의 길이

### 소스 코드
```javascript
const solution = (my_string, overwrite_string, s) => {
  const str = [...my_string];
  str.splice(s, overwrite_string.length, overwrite_string);
  return str.join('');
};
```

- `my_string`의 문자들을 각각의 배열 요소로 만들어준 다음, `splice()` 함수를 사용하여 `s`부터 `s` + `overwrite_string의 길이`에 해당하는 요소를 `overwrite_string`으로 바꿔주었다. 그리고 `join()` 함수를 통해 str에 있는 요소들을 모두 문자열로 합쳐주었다.

##### splice()
- `array.splice(start[, deleteCount[, item1[, item2[, ...]]]])` : `array`의 `start`부터의 요소를 삭제하거나 교체해준다,
	- `start`: 삭제 또는 변경을 시작할 인덱스
	- `deleteCount` : 배열에서 제거할 요소의 수
	- `items` : 배열에 추가할 요소, 없으면 삭제 진행

##### join()
- `array.join([separator])` : `array`에 있는 요소들을 하나의 문자열로 합쳐준다.
	- `seperator` : 요소 별 구분자(default : ',')

#### 오답 코드 & 다른 풀이 소스 코드
```javascript
const solution = (my_string, overwrite_string, s) => {
  let slice = my_string.slice(s, s + overwrite_string.length);

  return my_string.replace(slice, overwrite_string);
};
```
- 다른 방식으로 문제를 풀던 중 위의 코드가 오답 처리가 되었다. 단순하게 `replace()` 하면 해당하는 하나만 변경해주기 때문에 이렇게 작성하면 될 거라 생각했는데, `가장 앞에 있는 한 문자열`만 바꾸어주기 때문에, 중간에 있는 문자열을 바꾸고 싶은 경우, `오답 처리`가 되는 것이었다.

```javascript
my_string = "He11oWor1dHe11oWor1dHe11oWor1dHe11oWor1d"
overwrite_string = "lloWorl"
s = 12
```
- **기대값** = "He11oWor1dHe`lloWorl`dHe11oWor1dHe11oWor1d"
- **결과값** = "He`lloWorl`dHe11oWor1dHe11oWor1dHe11oWor1d"  
**맨 앞에 있는 "11oWor1"을 수정해주기 때문에 오답!**

```javascript
const solution = (my_string, overwrite_string, s) => {
  let first = my_string.substring(0, s);
  let subStr = overwrite_string;
  let last = my_string.substring(s + overwrite_string.length);

  return first + subStr + last;
};
```
- 다른 풀이로는 `substring()`을 이용하여 문제 풀이를 진행하였다. 
![](https://static.blex.me/images/content/2024/1/25/202412523_YUYp18bV18yZDaxPzTA9.png)
`substr()` 함수와 사용하는 방법이 같은데, `substr()` 함수가 deprecated 되면서 사용 방식이 같은 `substring()`을 이용해주었다.

##### substring()
- `substring(indexStart[, indexEnd])` : `indexStart`부터 string의 일부를 자른 상태로 반환
	- `indexStart` : 문자열 자르기 시작 인덱스
	- `indexEnd` : 문자열 자르기 끝 인덱스
	
## 참고 자료
- [String.prototype.substr(), MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr)
- [String.prototype.substring(), MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substring)
- [String.prototype.replace(), MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace)
- [Array.prototype.splice(), MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice)
