백준 2941번을 풀어보았다.
이 문제의 핵심은 문자열 대체이다.
특정 문자열이 존재하는지 확인하고, 존재할 경우 * 등으로 대체한다. 이후 전체 문자열의 길이를 출력한다.
크게 다음의 4가지 풀이로 정리해보았다.
- split().join() 사용
- replace 메소드 사용
- replaceAll 메소드 사용
- 정규표현식 사용
split().join() 사용
let word = require('fs').readFileSync('/dev/stdin').toString().trim()
const croatia = ['c=', 'c-', 'dz=', 'd-', 'lj', 'nj', 's=', 'z=']
for (const c of croatia) {
word = word.split(c).join('*')
}
console.log(word.length)
전체 문자열을 특정 문자열을 기준으로 split하고 *로 join한다.
결과적으로는 특정 문자열을 *로 대체한 것과 동일하다.
replace 메소드 사용
let word = require('fs').readFileSync('/dev/stdin').toString().trim()
const croatia = ['c=', 'c-', 'dz=', 'd-', 'lj', 'nj', 's=', 'z=']
for (const c of croatia) {
while (word.includes(c)) {
word = word.replace(c, '*')
}
}
console.log(word.length)
전체 문자열이 특정 문자열을 includes하는지 확인하고, includes할 경우 *로 replace한다.
이때 특정 문자열이 여러 번 존재할 수도 있으므로 while문을 통해 이 과정을 특정 문자열이 존재할 때까지 반복한다.
replaceAll 메소드 사용
let word = require('fs').readFileSync('/dev/stdin').toString().trim()
const croatia = ['c=', 'c-', 'dz=', 'd-', 'lj', 'nj', 's=', 'z=']
for (const c of croatia) {
word = word.replaceAll(c, '*')
}
console.log(word.length)
replace 메소드를 사용할 경우 특정 문자열이 여러 번 존재할 경우를 위해 while문을 사용해야 했다.
이때 replaceAll 메소드를 사용하면 이를 한 번에 처리할 수 있다.
정규표현식 사용
let word = require('fs').readFileSync('/dev/stdin').toString().trim()
word = word.replace(/c\=|c\-|dz\=|d\-|lj|nj|s\=|z\=/g, '*')
console.log(word.length)
그러나 replace 메소드의 첫번째 인자로 g 플래그가 있는 정규표현식을 전달하면 replace 메소드만으로도 이를 한 번에 처리할 수 있다.
정규표현식은 /로 감싸 나타내며 마지막에 g 플래그를 붙이면 전역 검색 모드*로 동작한다.
* g 플래그를 붙이지 않으면 처음 발견된 하나의 패턴만 replace하고, g 플래그를 붙이면 일치하는 모든 패턴을 replace한다.
💫 이 문제를 통해 배운 것
문자열을 대체하는 대표적인 메소드인 replace와 replaceAll은 아래와 같은 형태를 가진다.
replace(pattern, replacement) replaceAll(pattern, replacement)
이때 pattern은 문자열이거나 Symbol.replace 메소드가 있는 객체로, 일반적인 예로 정규표현식이 있다.
정규표현식은 /로 감싸 나타내며 g 플래그로 전역 검색 모드를 설정할 수 있다.
replaceAll의 pattern이 정규표현식일 경우 무조건 g 플래그를 붙여야 한다.