티스토리 뷰

반응형

 

 

 

지난 포스팅의 자바 Day 28 강좌 리뷰에 이어

이번 포스팅에서는 Day 28 자바 코드 리뷰를 진행해보자. 

 

 

Day 28

 


 

 

오늘 문제는 알고리즘은 알겠으나

정규 표현식을 접해보지 않아 조금은 생소했다.

 

그래서 먼저 정규표현식에 대해 공부하고

인터넷 여러 사이트를 참고하여

답안을 확인했다.

 

먼저 정규표현식에 대해 알아보자. 👇👇

 

 


🤔 정규 표현식(Regular Expreesion) 이란?

: 특정한 규칙을 가진 문자열의 집합이다.

 

우리는 문제에서 @gmail.com이라는 이메일만

취급하기로 했으므로

정규 표현식을 이용해야한다.

 

소스코드는 

(출처 - 글자 클릭 시 이동)의 소스코드를 그대로 가져왔고,

정규 표현식이나 코드 사용 이유 등 이런저런 블로그를 통해

필자가 학습한 내용을 주석으로 추가했다.

 

출처는 코드안에 또 한 번 명시되어 있다.

(필자가 참고한 사이트의 모든 링크가 표시되어 있다.)

 

그럼 코드를 한번 살펴보자.

 

import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.function.*;
import java.util.regex.*;
import java.util.stream.*;
import static java.util.stream.Collectors.joining;
import static java.util.stream.Collectors.toList;



public class Solution {
    private static final Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        int N = scanner.nextInt();
        scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");
        //   scanner.skip 사용 이유
        //   \r\n : Windows line ending
        //   \n : Unix line ending
        //   \r : Macintosh (pre-OSX) line ending
        //   \u2028 : line separator (줄 구분자) - 유니코드
        //   \u2029 : paragraph separator (문단 구분자) - 유니코드
        //   \u0085 : next line(nel) (다음 줄) - 유니코드
        //    결론 : 여러 줄 입력받을 때 입력값이 없는 줄(엔터)도 한줄로 인식하므로
        //          그 줄은 한줄로 인식하지 않기 위해 사용




        String regexEmailId = "[a-z]{1,40}@gmail\\.com";
        // 문제에서 제시된 이메일 정규 표현식
        // [a-z] : a부터 z까지 문자들이 올 수 있다.
        // {1,40} : 앞의 [a-z]에 해당하는 소문자가 최소 1개에서 최대 39개 이하로 나와야 한다.
        // @gmail\\.com : 문자가 포함되어야 한다.

        String regexFirstName = "[a-z]{1,20}";
        // 문제에서 제시된 firstName 표현식
        // [a-z] : a부터 z까지 문자들이 올 수 있다.
        // {1,40} : 앞의 [a-z]에 해당하는 소문자가 최소 1개에서 최대 19개 이하로 나와야 한다.

        Pattern pEmailId = Pattern.compile(regexEmailId);
        Pattern pfirstName = Pattern.compile(regexFirstName);
        System.out.println("pEmailId : " + pEmailId);
        System.out.println("pfirstName : " + pfirstName);

        List<String> resultList = new ArrayList<String>();

        for (int NItr = 0; NItr < N; NItr++) {
            String[] firstNameEmailID = scanner.nextLine().split(" ");

            String firstName = firstNameEmailID[0];

            String emailID = firstNameEmailID[1];

            System.out.println("firstName = " + firstName);
            System.out.println("emailID = " + emailID);

            Matcher firstNameM = pfirstName.matcher(firstName);
            Matcher emailM = pEmailId.matcher(emailID);

            System.out.println("firstNameM = " + firstNameM);
            System.out.println("emailM = " + emailM);

            // 이메일이 유효하지 않을 때 continue;
            if(!emailM.find()){
                continue;
            }

            // 사람이름이 유효할때 add
            if(firstNameM.find()){
                resultList.add(firstName);
            }

        }

        // 오름차순 정렬
        Collections.sort(resultList);
        for(String temp : resultList)
            System.out.println(temp);

        scanner.close();

//        출처 : https://dev-kimse9450.tistory.com/17
//        출처 : https://blog.outsider.ne.kr/360
//        출처 : https://cyberpunkvv.blogspot.com/2019/05/hackerrank-day-28-regex-patterns-and.html


    }
}

 

 

지금까지의 모든 해커랭크 챌린지 중

가장 생소하고 낯설고 어려웠다.

 

또한 이것을 어떻게 설명해야할지 어려워

열심히 공부했다!!

 

말로만 설명하는 것 보다

코드밑에 주석으로 하나하나 설명하는 것이

이해가 쉬울 듯 하여 위와 같은 방법으로 설명했다.

 

블로그 포스팅 덕분에

평소라면 그냥 가볍게 공부하고 넘어갔을

정규식표현에 대해서 제대로 알 수 있게 되었다!!

 

 

혹시나 이해가 되지 않는 부분이 있다면

댓글로 질문 남겨주면

필자가 아는 한에서 최대한 성실히 답변하도록 하겠다!!

 


 

그럼 우리는 다음 포스팅에서 다시 만나자. 😆

반응형