# 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;
}
 |