본문 바로가기

CS ﹒ Algorithm/Baekjoon

JAVA 백준 문제풀이 (26) 9996: 한국이 그리울 땐 서버에 접속하지

 

 

오늘은 두가지 정답을 준비했다.

첫번째는 죽었다 깨어나도 정규식은 못 외우겠다는 사람을 위한 것이고 두번째는 정규식을 이용하는 것이다.

정규식은 분명 굉장히 유용하지만IDE도 못 쓰고 검색도 못하는 대부분의 코딩 테스트 특성상 정말 재수가 없게도 이런 문제를 만난다면 내 기억력에만 의존해야하며 점 하나까지 신경 써야하는 정규식보다 조금 돌아가는 길이 나을 수도 있다.

 

물론 이 문제를 푸는데 필요한 정규식은 굉장히 쉽기 때문에 '이 문제만 생각하면' 정규식을 외우는 게 더 편하다.

잘 모르겠어서 검색은 했는데 스스로 풀고 싶은 사람이라면 정답을 보기 전에 subString이나 indexOf를 활용해서 푸는 것을 시도해보자.

10분동안 생각해봤는데 모르겠으면 밑으로.

 

BufferedReader || Scanner

StringBuilder || OuputStreamWriter || System.out.print || StringTokenizer

이런 것들은 제한 시간이 굉장히 빡빡한 경우를 제외하면 취향이니 크게 신경 쓸 필요 없다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1. 정규식 버전

 

import java.io.*;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder result = new StringBuilder();
        int T = Integer.parseInt(br.readLine()); 
        String[] inputPattern = br.readLine().split("\\*"); // 패턴을 입력 받아 *을 기준으로 나눈다
        String[] fileNames = new String[T];

        String pattern = "^" + inputPattern[0] + ".*" + inputPattern[1] + "$"; // 정규식 완성

        for (int i=0; i<T; i++) {
            fileNames[i] = br.readLine(); // 검사할 문자열들을 입력받음
        }

        for (String s : fileNames) {
            if (Pattern.matches(pattern, s) && s.length() != 1) { 
                result.append("DA").append("\n");
            } else {
                result.append("NE").append("\n");
            } 
        }

        System.out.println(result);
        }
    }

 

 

크게 설명할 것은 없다.

length가 1인 경우를 제외해주지 않으면 a*a 정규식에 a가 들어갔을 때 DA가 출력되는 불상사가 발생한다.

사실 정규식을 더 구체적으로 작성해서 글자수까지 제한을 해주면 그만이긴 한데, 나는 이게 더 편하다.

 

 

 

 

 

 

2. 정규식 사용하지 않는 버전

 

import java.util.*;
import java.io.*;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder result = new StringBuilder();
        int T = Integer.parseInt(br.readLine()); // 입력받을 파일명 개수
        String[] inputPattern = br.readLine().split("\\*");
        String[] fileNames = new String[T];

        for (int i=0; i<T; i++) {
            fileNames[i] = br.readLine();
        }

        for (String s : fileNames) {
            if (s.indexOf(inputPattern[0])==0 &&
            s.lastIndexOf(inputPattern[1])==s.length()-inputPattern[1].length() &&
            inputPattern[0].length() + inputPattern[1].length() -1 <= s.length()) {
                result.append("DA").append("\n");
            } else {
                result.append("NE").append("\n");
            }
        }

        System.out.println(result);
        }
    }

 

예외가 더 많아져서 조건문이 조금 더 복잡해졌고 정규식을 사용하지 않기 때문에 패턴이 빠졌다.

패턴으로 들어오는 문자열이 "a*b"이런 식으로 단순하면 정규식 버전하고 차이가 없는데, "aa*bbb"같은 형태로 여러 글자가 들어오는 순간 인덱스를 조금 더 신경써줘야 한다.

크게 어려운 건 아니라서 남이 작성한 코드 보고 이해하는 것보다 방법만 이해했다면 직접 작성하는 게 더 쉽게 느껴질 것이다.