[21/08/12 KATA NINJA] 괄호변환 & 튜플 & 파일명 정렬 & 정규표현식

NinjaJuunzzi·2021년 8월 12일
0

코드카타

목록 보기
12/36
post-thumbnail

괄호변환

// 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그룹을 matching
  • flag도 상당히 중요하다

global flag

not global flag

correct

숫자 전에 등장하는 숫자가 아닌 문자열들과 숫자들을 그룹으로 구분하고 match 해야함. 보다 +맞음 숫자는 무조건 나옴 ( 는 0일 수 있지만, +는 무조건 한개는 있음 )

정규표현식 연습

정규표현식 연습 사이트이다.

정규표현식 적용 사이트이다.

캐릭터

와일드 카드가 있어야함

an으로 끝나는 단어

밑에 이건 안된다.

반복

? (0,1)

abc? -> ab,abc

white space

not

start-end

중첩 그룹

괄호를 보고 그룹을 생각하면 된다.

조건


위와 같이 하면 틀리다.
I love cats or dogs가 되어버림

cats or dogs가 되기위해선 밑에 처럼 묶어주면 댄다

profile
Frontend Ninja

0개의 댓글