티스토리 뷰
🐣 정규표현식 이용해서 풀었던 알고리즘 문제 모음
[백준] 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# )
'시리즈 > Javascript' 카테고리의 다른 글
[node] node로 웹 프로젝트 시작할 때 나오는 용어들 정리 (0) | 2021.02.27 |
---|---|
[react] create-react-app으로 만든 app에서 테스트용 서버는 어떻게 돌아가나 (0) | 2021.02.27 |
Map and Set (0) | 2021.02.20 |
String.prototype.replace() 함수 (0) | 2021.01.22 |
javascript 팁 (0) | 2021.01.21 |