# Level 0. 모음 제거
모음 제거
문제 설명
영어에선 a, e, i, o, u 다섯 가지 알파벳을 모음으로 분류합니다. 문자열 my_string이 매개변수로 주어질 때 모음을 제거한 문자열을 return하도록 solution 함수를 완성해주세요.
제한사항
- my_string은 소문자와 공백으로 이루어져 있습니다.
- 1 ≤ my_string의 길이 ≤ 1,000
문제 풀이
1
2
3
4
5
6
7 | function solution(my_string) {
const vowel = ["a", "e", "i", "o", "u"];
return my_string
.split("")
.filter((char) => !vowel.includes(char))
.join("");
}
|
# Level 0. 컨트롤 제트
컨트롤 제트
문제 설명
숫자와 “Z”가 공백으로 구분되어 담긴 문자열이 주어집니다. 문자열에 있는 숫자를 차례대로 더하려고 합니다. 이 때 “Z”가 나오면 바로 전에 더했던 숫자를 뺀다는 뜻입니다. 숫자와 “Z”로 이루어진 문자열 s가 주어질 때, 머쓱이가 구한 값을 return 하도록 solution 함수를 완성해보세요.
제한사항
- 1 ≤ s의 길이 ≤ 200
- -1,000 < s의 원소 중 숫자 < 1,000
- s는 숫자, “Z”, 공백으로 이루어져 있습니다.
- s에 있는 숫자와 “Z”는 서로 공백으로 구분됩니다.
- 연속된 공백은 주어지지 않습니다.
- 0을 제외하고는 0으로 시작하는 숫자는 없습니다.
- s는 “Z”로 시작하지 않습니다.
- s의 시작과 끝에는 공백이 없습니다.
- “Z”가 연속해서 나오는 경우는 없습니다.
문제 풀이
1
2
3
4
5
6
7
8
9
10
11 | function solution(s) {
let answer = 0;
s = s.split(" ");
s.forEach((num, index) => {
if (index === 0) return;
if ((num === "Z") | (s[index - 1] === "Z")) return;
answer += s[index - 1] * 1;
});
answer += s[s.length - 1] !== "Z" ? s[s.length - 1] * 1 : 0;
return answer;
}
|
- 수를 더했다가 빼주는 것보다, 그 다음번 index가 Z인지 확인하면 연산을 줄일 수 있을거라고 판단함.
- forEach 문에서 return을 사용해서 for문의 continue를 대체함.
# Level 0. 공 던지기
공 던지기
문제 설명
머쓱이는 친구들과 동그랗게 서서 공 던지기 게임을 하고 있습니다. 공은 1번부터 던지며 오른쪽으로 한 명을 건너뛰고 그다음 사람에게만 던질 수 있습니다. 친구들의 번호가 들어있는 정수 배열 numbers와 정수 K가 주어질 때, k번째로 공을 던지는 사람의 번호는 무엇인지 return 하도록 solution 함수를 완성해보세요.
제한사항
- 2 < numbers의 길이 < 100
- 0 < k < 1,000
- numbers의 첫 번째와 마지막 번호는 실제로 바로 옆에 있습니다.
- numbers는 1부터 시작하며 번호는 순서대로 올라갑니다.
풀이
1
2
3
4
5 | const solution = (numbers, k) => {
const passedLength = (k - 1) * 2;
const index = passedLength % numbers.length;
return numbers[index];
};
|
- 배열의 길이가 홀수, 짝수마다 거쳐갈 수 있는 사람이 달라서 하나의 식으로 풀이하면 예외가 있을거라고 생각했었다.
- numbers.length가 홀수, 짝수마다 나머지도 고정되기 때문에 하나의 식으로 풀이해도 모든 경우의 수를 검사할 수 있었다.
# Level 0. 합성수 찾기
합성수 찾기
문제 설명
약수의 개수가 세 개 이상인 수를 합성수라고 합니다. 자연수 n이 매개변수로 주어질 때 n이하의 합성수의 개수를 return하도록 solution 함수를 완성해주세요.
제한사항
첫번째 풀이
1
2
3
4
5
6
7
8
9
10
11
12 | const solution = (n) => {
let answer = 0;
for (let i = 4; i <= n; i++) {
for (let j = 2; j <= Math.floor(Math.sqrt(i)); j++) {
if (i % j === 0) {
answer++;
break;
}
}
}
return answer;
};
|
- 단순한 소수 찾기이다.
- 더 나은 방법이 없을지 고민했다.
- 팀원중에 한 분이 에라토스테네스의 체를 응용하는 방법에 대해 의견을 제시해주셨다.
두번째 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | const solution = (n) => {
const screener = new Array(n + 1).fill(false);
for (let i = 2; i <= Math.floor(Math.sqrt(n)); i++) {
if (screener[i]) continue;
let multiplier = 2;
while (i * multiplier <= n) {
screener[i * multiplier] = true;
multiplier++;
}
}
return screener.filter((result) => result).length;
};
|
- 이처럼 코드를 쓰게 되면, 반복문에 대한 시간 복잡도도 줄어들고 약수의 개수에 따라 분기 처리를 하기가 더 쉬워진다.
# Level 0. 문자열 나누기
문자열 나누기
문제 설명
문자열 s가 입력되었을 때 다음 규칙을 따라서 이 문자열을 여러 문자열로 분해하려고 합니다.
- 먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다.
- 이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다.
- s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 남은 부분이 없다면 종료합니다.
- 만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.
문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열들로 분해하고, 분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요.
첫번재 풀이
- 1 ≤ s의 길이 ≤ 10,000
- s는 영어 소문자로만 이루어져 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 | function solution(s) {
let answer = 0;
let currChar = "";
let sameCount = 0;
let diffCount = 0;
let isSplitted = true;
s.split("").forEach((char) => {
if (isSplitted) {
answer++;
currChar = char;
sameCount = 1;
diffCount = 0;
isSplitted = false;
return;
}
if (currChar === char) {
sameCount++;
} else {
diffCount++;
}
if (sameCount === diffCount) {
isSplitted = true;
}
});
return answer;
}
|