ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 한국이 그릴울 땐 서버에 접속하지 - 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');
      }
    }

     

     

     

     

    출처

    백준 9996번 한국이 그릴울 땐 서버에 접속하지

Designed by Tistory.