-
[백준] 한국이 그릴울 땐 서버에 접속하지 - JavaScript알고리즘/Javascript 문제 2025. 4. 10. 02:21
오늘은 정규 표현식을 사용해서 문자열에 해당 패턴이 있는지 없는지 검사하는 비교적 쉬운 문제를 풀어본다. 이 문제는 정규표현식을 알고, 관련 생성자 함수와 메서드를 사용할 줄 아는지 물어보는 문제이다.
문제
1. 입력
- 파일의 개수 N
- 알파벳 소문자와 별표 한 개로 이루어진 문자열 패턴
- 파일 이름 N개
2. 로직: 정규 표현식으로 문자열 치환하여 조건문 분기처리에 활용하기
3. 출력: 패턴과 일치하면 "DA", 일치하지 않으면 "NE"
- 크로아티아이어로 "DA" === "YES", "NE" === "NO"
제출 답안
문제에서 주어지는 패턴은 ‘a*b’와 같은 일반 문자열로 제공된다. 이는 일반적인 와일드카드 패턴(*)을 포함하고 있다. 하지만 JavaScript의 정규 표현식에서는 ‘*’가 와일드카드가 아니라, 바로 앞의 문자가 0번 이상 반복됨을 의미한다. 따라서, pattern을 정규 표현식으로 변환하지 않으면 의도한 대로 작동하지 않는다.
- a*b는 정규 표현식으로 “a 뒤에 d가 올 수 있으며, 그 사이에 어떤 문자도 올 수 있음”을 의미하지 않는다.
- 대신, 와일드카드 패턴 ‘*’을 정규 표현식 ‘.*’으로 변환해야 한다.
- ‘*’은 정규 표현식에서 ‘.*’로 변환
- 문자열의 시작과 끝을 고려하여 ‘^’(시작)과 ‘$’(끝)을 추가
- 예를 들어, 패턴 ‘a*b’는 정규 표현식으로 변환하면 ‘^a.*d$’가 됨
const input = process.platform === 'linux' ? require('fs').readFileSync('/dev/stdin').toString().trim().split('\n') : ['3', 'a*d', 'abcd', 'anestonestod', 'facebook']; const [_, pattern, ...files] = input; // 와일드카드 패턴을 정규 표현식으로 변환 const regexPattern = '^' + pattern.replace(/\*/g, '.*') + '$'; const regex = new RegExp(regexPattern); for (let file of files) { if (regex.test(file)) { // 정규 표현식을 사용하여 매칭 확인 console.log('DA'); } else { console.log('NE'); } }
혹시, String.prototype.match() 메서드를 사용한다면 아래와 같이 쓸 수 있다.
... if (file.match(regex)) { console.log('DA'); } else { console.log('NE'); } }
출처
'알고리즘 > Javascript 문제' 카테고리의 다른 글
최대값, 최소값 - JavaScript (0) 2025.04.02 피보나치 수열 (Fibonacci Sequence) - JavaScript (0) 2025.04.02 소수 (Prime) - JavaScript (0) 2025.04.01 순열, 조합, 팩토리얼 - JavaScript (0) 2025.03.13 [Softeer] Lv.2 바이러스 - JavaScript (0) 2025.02.27