// U V를 알아내는 함수
function getUV(p, LEFT, RIGHT) {
let count = 0;
while (LEFT !== RIGHT) p[count++] === "(" ? LEFT++ : RIGHT++;
return [p.slice(0, RIGHT + LEFT), p.slice(RIGHT + LEFT)];
}
function validate(u, stack) {
// 올바른 괄호인지 아닌지를 체크한다.
return (
// 좌괄호면 푸시 우괄호면 팝하여, 순회후에 스택이 비어있으면 -> 올바른 문자열이다
// 순회후에 스택이 안비어있다면 -> 우괄호가 앞에 나와 올바르지 못한 문자열인 것임.
!u.split("").forEach((c) => (c === "(" ? stack.push(c) : stack.pop(c))) &&
stack.length === 0
);
}
function solution(p) {
// 빈문자열이면 리턴한다.
if (p === "") return p;
// u,v를 구한다.
const [u, v] = getUV(p, 0, 0);
// 올바른 문자열이면 u에 다가 v를 재귀 한 값을 붙인다.
if (validate(u, [])) return u + solution(v);
// 올바르지 못한 문자열이면 문제대로 과정을 수행한다.
return `(${solution(v)})${[...u.slice(1, -1)]
.map((c) => (c === ")" ? (c = "(") : (c = ")")))
.join("")}`;
}
function solution(s) {
var answer = [];
s.split(/[{}]/)
.filter((i) => i !== "" && i !== ",")
.map((a) => a.split(","))
.sort((a, b) => a.length - b.length)
.forEach((sub) => {
answer.push(...sub.filter((i) => !answer.includes(i)));
});
return answer.map((i) => +i);
}
solution("{{133,2,3},{2,1},{1,2,4,3},{2}}");
이 문제같은 경우는 중괄호 -> 대괄호로 바꾸어
이걸 이용해 배열로 만든다음 작업할 수 도 있음.
function solution(files) {
return files
.map((str) => {
const [head, number, tail] = str.split(/(\d+)/);
return { head: head.toLowerCase(), number: +number, tail, str };
})
.sort((a, b) => {
if (a.head > b.head) return 1;
if (a.head < b.head) return -1;
if (a.head === b.head) {
return a.number - b.number;
}
return 0;
})
.map((file) => file.str);
}
(\D*)([0-9]*)
=> 숫자가 아닌것으로 반복된 1그룹, 숫자로 반복된 2그룹을 matchingflag
도 상당히 중요하다숫자 전에 등장하는 숫자가 아닌 문자열들과 숫자들을 그룹으로 구분하고 match
해야함. 보다 +맞음 숫자는 무조건 나옴 ( 는 0일 수 있지만, +는 무조건 한개는 있음 )
밑에 이건 안된다.
abc? -> ab,abc
괄호를 보고 그룹을 생각하면 된다.
위와 같이 하면 틀리다.
I love cats or dogs가 되어버림
cats or dogs가 되기위해선 밑에 처럼 묶어주면 댄다