티스토리 뷰

시리즈/Javascript

정규표현식 예제

빅또리 2021. 2. 20. 14:12

🐣 정규표현식 이용해서 풀었던 알고리즘 문제 모음

 

 

 

 

 

[백준] 2941. 크로아티아 알파벳

링크 : https://www.acmicpc.net/problem/2941

 

입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

const readline = require('readline');
const rl = readline.createInterface(process.stdin, process.stdout);

let input = [];

let eval = () => {
  const regex = /(c(=|-))|(d(z=|-))|lj|nj|s=|z=|[a-z]/g;
  const str = input[0];
  let count = [...str.matchAll(regex)].length;
  console.log(count);
}

rl.on('line', function(line){
  input.push(line);
}).on('close', eval)

 

 

 

 

 

[leetcode] 394. Decode String

링크 : leetcode.com/problems/decode-string/

 

예시

let decodeString = function(s) {
    let re = /(\d+)\[(\w+)\]/g;
    
    while(re.test(s)){
        s = s.replace(re, (_, num, str) => str.repeat(num));
    }
    
    return s;
};

2021/01/22 - [javascript] - String.prototype.replace() 함수

 

 

 

 

 

[leetcode] 13. Roman to Integer

링크 : https://leetcode.com/problems/roman-to-integer/

 

주어진 로마 숫자 10 digit숫자로 바꾸기

var romanToInt = function (s) {
    let numerals = [["I", 1], ["IV", 4], ["V", 5], ["IX", 9], ["X", 10], ["XL", 40], ["L", 50], ["XC", 90], ["C", 100], ["CD", 400], ["D", 500], ["CM", 900], ["M", 1000]];
    //let hash = numerals.reduce((m, [s,v])=>m.set(s,v), new Map())    
    let hash = new Map(numerals);

    let reg = /IV|IX|XL|XC|CD|CM|[IVXLCDM]/g;
    //★이렇게 하면 iterator가 array로 바껴서 다루기 쉬움
    const matches = [...s.matchAll(reg)];

    let sum = 0;
    for (m of matches) {
        sum += hash.get(m[0]);
    }

    return sum;
};

 

(참고)

                 이렇게 하면 숫자 전체가 뭉텅이로 매치되고, 안의 부분들이 그룹으로 캡쳐됨               /  내가 한대로 하면 가능한 숫자 단위 마다 매치

 

 

 

 

 

[카카오 2018 blind] 방금 그곡

링크 : https://programmers.co.kr/learn/courses/30/lessons/17683

 

악보에 사용되는 음은 C, C#, D, D#, E, F, F#, G, G#, A, A#, B 12개이다

단순히 char 1개씩으로 자르면 안되고 C#같은 케이스는 char 2개가 한음인걸 고려해서 풀어줘야한다,

 

function solution(m, musicinfos) {
    const reg= /[CDFGA]#?|[EB]/g;
    const mreg = new RegExp(`${m}(?!#)`);
    function duration(t1,t2){
        //t1이 t2보다 이른 시각
        let [a,b] = [t1,t2].map(t=>t.split(':').map(x=>parseInt(x)).reduce((a,x,i)=>a+x*(i==0?60:1), 0));
        return b-a;
    }
    let songlist = musicinfos.reduce((a,x)=>{
        let [start,end,title,melody] = x.split(',');
        let scale = [...melody.matchAll(reg)].map(x=>x[0]);
        let len = scale.length;
        let time = duration(start,end);

        let played_melody = melody.repeat(parseInt(time/len))+scale.slice(0,time%len).join("");
        if(!mreg.test(played_melody)) return a;
        a.push([title, time]);
        return a;
    } ,[]);

    return songlist.length==0? "(None)" :  songlist.sort((a,b)=>b[1]-a[1])[0][0];

}

[1] 변수값을 이용해서 정규표현식 만들고 싶을때 

 

생성자함수와 템플릿리터럴 이용하면 된다.

const regex = new RegExp(`정규표현식${변수}정규표현식`);

 

[2] lookahead, lookbehind

 

X(?=Y) : Y가 뒤따라오는 X를 매치하고 싶다.   (positive lookahead)

X(?!Y)  : Y가 뒤따라오지 않는 X를 매치하고 싶다.  (negative lookahead)

(?<=Y)X : Y가 앞에 있는 X를 매치하고 싶다.    (positive lookbehind)

(?<!Y)X  : Y가 앞에 없는 X를 매치하고 싶다.     (negative lookbehind)

 

플레이된 멜로디 문자열에 네오가 들은 m이 있는지 확인하고 싶으면 

뒤에#이 붙지 않은 m이 거기에 포함되어있는지 확인하면 됨.  ( ABC != ABC# )

댓글
공지사항
최근에 올라온 글