21-03-24 알고리즘 문제풀기 및 노트 정리
스킬트리
- 처음엔 각 스킬을 키로, 인덱스를 값으로 갖는 객체를 만들어 풀려 했으나 스킬트리 내 스킬들 인덱스 비교가 어려워서 다른 방법을 찾다가 정규식으로 처리하는 방법을 찾음
1 | function solution(skill, skill_trees) { |
괄호 변환
1 | 1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다. |
1 | function solution(p) { |
- 재귀적으로 구현하는 법에 대해서 완벽하게 이해하지 못해서 다른 사람 풀이를 참고함
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24function solution(p) {
if (p.length < 1) return ""; // 1번
let balance = 0; // 재귀적으로 호출될 때마다 0으로 초기화됨
let pivot = 0;
do {
balance += p[pivot++] === "(" ? 1 : -1 // 좌측 괄호라면 1을 아니라면 -1을 더함
} while (balance !== 0); // 0이라면 "균형잡힌 괄호 문자열"
const u = p.slice(0, pivot); // balance가 0이 아니라면 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리
const v = solution(p.slice(pivot, p.length)); // v는 1부터 다시 수행해야 하므로 재귀적으로 함수를 호출 (u로 나눠진 부분 다음부터)
if (u[0] === "(" && u[u.length - 1] == ")") // 첫 괄호와 마지막 괄호를 검사해 "올바른 괄호 문자열"인지 확인
return u + v;
else
return "(" + v + ")" + reverse(u);
}
function reverse(str) {
return str.slice(1, str.length - 1) // u의 첫 번째와 마지막 문자를 제거
.split("")
.map((c) => (c === "(" ? ")" : "(")) // 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙임
.join(""); // 다시 문자열로 join하여 리턴
}소수 찾기(레벨2)
해당 문제 링크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
29
30
31
32
33
34
35
36
37
38
39
40function solution(numbers) {
let answer = 0;
let primeNums = [];
let splitedNumbers = numbers.split('')
const isPrime = num => {
let count = 0;
for(let i = 1; i <= num; i++) {
if (num % i === 0) {
count++;
}
if (count >= 3) {
break;
}
}
if (count === 2 && !primeNums.includes(num)) {
primeNums.push(num);
}
}
const createNumbers = (arr, str) => {
if (arr.length > 0) {
for (let i = 0; i < arr.length; i++) {
const temp = [...arr];
temp.splice(i, 1);
createNumbers(temp, str + arr[i])
}
}
if (str.length > 0) {
isPrime(+str);
}
}
createNumbers(splitedNumbers, '');
answer = primeNums.length;
return answer;
}