[JS][백준]9996_한국이 그리울 땐 서버에 접속하지
Algorithm/BaeKJoon

[JS][백준]9996_한국이 그리울 땐 서버에 접속하지

문제 번호

 

9996번: 한국이 그리울 땐 서버에 접속하지

총 N개의 줄에 걸쳐서, 입력으로 주어진 i번째 파일 이름이 패턴과 일치하면 "DA", 일치하지 않으면 "NE"를 출력한다. 참고로, "DA"는 크로아티어어로 "YES"를, "NE"는 "NO"를 의미한다.

www.acmicpc.net

 

 

 

알고리즘 분류

 

문제 풀이

 정규식을 사용하지 않아도 문제를 해결할 수 있다. '*'를 기준으로 주어진 패턴을 split 한 다음 나누어진 두개의 패턴이 주어지는 입력들과 일치하는지 확인하면된다.

 그러나 문제를 처음 접했을때 '정규표현식'을 사용하여 문제풀이를 시도하였기때문에 끝까지 정규표현식을 사용해서 풀이를 진행했다.

 

 정규식이 익숙하지 않아서 정규식을 사용함에 있어서 MDN을 많이 참고하였다.

 

RegExp - JavaScript | MDN

The RegExp object is used for matching text with a pattern.

developer.mozilla.org

 

 처음에는 주어지는 패턴을 new RegExp()를 사용하여 정규식으로 생성하고 Match()를 사용하여 정답을 찾으려하였다.

그러나 Match()는 문자열중에 해당 정규식과 일치하는 부분이 '있기만하면' 참으로 판단한다. 따라서 해당문제에 사용하기 위해서는 주어진 패턴을 조금 수정해서 정규식으로 제작하여야 한다.

 우리는 '*'앞에 있는 문자열로 시작해서 '*'뒤에 있는 문자열로 끝나는 문자열만 'DA'로 처리해야한다. 그래서 우선 주어진 패턴을 '*'를 기준으로 split() 해준다. 이때 split()된 문자열뒤에 '/r'이 붙어서 trim()처리를 해주었다.

input[1] = input[1].split('*').map(_ => _.trim());

 

이제 나누어진 문자열중 앞부분에 해당되는 내용으로 시작해야하니 '^'를 사용해서 처리해준다.

input[1][0] = '^' + '(' + input[1][0] + ')';

 

그리고 나누어진 문자열중 뒷부분에 해당되는 내용으로 끝나야하니 '$'를 사용해서 처리해준다.

input[1][1] = '(' + input[1][1] + ')' + '$';

 

 이제 나누어졌던 문자열을 다시 합쳐서 정규식으로 만들어야한다. 이때 '*'에는 소문자가 갯수상관없이 들어올 수 있으므로 '/w'를 사용하여 처리해줄것이다. 이때 '/'를 사용하기 위해서는 '//' 와 같이 사용해함에 주의한다.

let partten = new RegExp(input[1].join('(\\w)*').trim());

 

 예제 입력2의 경우 위의 과정들을 거치게되면 다음과 같은 정규식이 탄생한다.

/^(h)(\w)*(n)$/
 
 이제 주어지는 입력들을 match()를 사용하여 패턴과 일치하는지 확인하면된다.
    for (let i = 0; i < N; i++) {
        //console.log(input[i+2].trim().match(partten))
        if (input[i + 2].trim().match(partten))
            answer += 'DA' + '\n';
        else
            answer += 'NE' + '\n';
    }
 

전체코드

const input = require('fs').readFileSync('input.txt').toString().trim().split('\n');
let N = +input[0];

function sol() {
    let answer = '';
    // 시작과 끝을 생각해야함.
    input[1] = input[1].split('*').map(_ => _.trim());
    input[1][0] = '^' + '(' + input[1][0] + ')';
    input[1][1] = '(' + input[1][1] + ')' + '$';
    let partten = new RegExp(input[1].join('(\\w)*').trim());
    //console.log(partten)
    for (let i = 0; i < N; i++) {
        //console.log(input[i+2].trim().match(partten))
        if (input[i + 2].trim().match(partten))
            answer += 'DA' + '\n';
        else
            answer += 'NE' + '\n';
    }

    console.log(answer.trim());
}
sol();

 

특이사항

 정규식을 다루는건 더 연습해야한다. 문자열을 다룰때 '/n' 이나 '/r' 처럼 원하지않는 내용들이 포함될 수 있으니 적절하게 trim()을 사용해야한다. 

 

정규 표현식 - JavaScript | MDN

정규 표현식, 또는 정규식은 문자열에서 특정 문자 조합을 찾기 위한 패턴입니다. JavaScript에서는 정규 표현식도 객체로서, RegExp의 exec()와 test() 메서드를 사용할 수 있습니다. String의 match(), matchA

developer.mozilla.org

 

'Algorithm > BaeKJoon' 카테고리의 다른 글

[JS][백준]2573_빙산  (0) 2022.03.30
[JS][백준]11057_오르막 수  (0) 2022.03.30
[JS][백준]17615_볼 모으기  (0) 2022.03.21
[JS][백준]5582_공톤 부분 문자열  (0) 2022.03.21
[JS][백준]13549_숨바꼭질 3  (0) 2022.03.11