문제: https://www.acmicpc.net/problem/9996
알고리즘 분류: 정규 표현식, 문자열
패턴은 알파벳 소문자와 별표(*) 하나로 구성됨
파일 이름은 알파벳 소문자로만 구성됨
별표는 임의의 문자열(빈 문자열 포함)로 대체 가능
각 파일 이름이 패턴과 일치하는지 확인해야 함
패턴은 별표를 기준으로 앞부분(prefix
)과 뒷부분(suffix
)으로 나눌 수 있음
파일 이름이 패턴과 일치하려면:
파일 이름이 패턴의 앞부분으로 시작해야 함
파일 이름이 패턴의 뒷부분으로 끝나야 함
파일 이름의 길이가 최소한 (prefix
+ suffix
) 이상이어야 함
패턴을 별표(*
)를 기준으로 앞부분과 뒷부분으로 분리
각 파일 이름에 대해:
파일 이름이 패턴의 앞부분으로 시작하는지 확인
파일 이름이 패턴의 뒷부분으로 끝나는지 확인
중간 부분이 겹치지 않는지 확인 (prefix
와 suffix
가 겹치는 경우 고려)
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim();
const lines = input.split('\n');
const n = parseInt(lines[0]);
const pattern = lines[1];
const parts = pattern.split('*');
const prefix = parts[0];
const suffix = parts[1];
const results = [];
for (let i = 0; i < n; i++) {
const filename = lines[i + 2];
// 파일 이름 길이가 prefix + suffix보다 짧으면 패턴과 일치 불가능
if (filename.length < prefix.length + suffix.length) {
results.push("NE");
continue;
}
// 파일 이름이 패턴의 앞부분으로 시작하는지 확인
if (!filename.startsWith(prefix)) {
results.push("NE");
continue;
}
// 파일 이름이 패턴의 뒷부분으로 끝나는지 확인
if (!filename.endsWith(suffix)) {
results.push("NE");
continue;
}
// 모든 조건을 만족하면 패턴과 일치
results.push("DA");
}
console.log(results.join('\n'));
참고
https://bedecked-operation-4d1.notion.site/99-8-TIL-1d0eb405261e80f68c5ed675c161efe7