감자는 아직 꿈을 꾼다.

[백준-java] 9996번 실버 3 한국이 그리울 땐 서버에 접속하지 본문

코테적 감자/백준

[백준-java] 9996번 실버 3 한국이 그리울 땐 서버에 접속하지

dreaming-potato 2024. 11. 16. 22:45

String 문제

자바의 String 메소드를 활용해서 풀 수 있는 문제
3가지 방식으로 풀이를 설명한다


문제 설명

https://www.acmicpc.net/problem/9996

 


내 풀이

 

주어진 패턴을 * 를 기준으로 split하여 앞부분과 뒷부분을 나누고
substring을 활용해서 주어진 문자열과 같은지 확인한다.
주의할 점은 주어진 문자열이 first와 second의 합보다 작은 것에 예외처리

또한 split할 때 그냥 * 로 하면 아래와 같은 에러가 뜨게된다.
**Dangling meta character ' * ' near index 0

+, * , ^ 로 나누고자 할 때도 발생하는 오류로
**앞에 \ 기호 두개를 붙여야 된다.

 


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb =new StringBuilder();

        int N = Integer.parseInt(br.readLine());
        String pattern = br.readLine();
        String[] given = pattern.split("\\*");
        String first = given[0];
        String second = given[1];

        for (int i = 0 ; i< N ; i++) {
            String pb = br.readLine();
            if ( pb.length() >= first.length() + second.length() && 
                    first.equals(pb.substring(0,first.length()))&&
                    second.equals(pb.substring(pb.length()-second.length(),pb.length())) ) {
                sb.append("DA\n");
            }else sb.append("NE\n");
        }
        System.out.println(sb);
    }
}

 

startsWith && endsWith를 활용한 풀이

 

이게 더 가독성이 좋고 자바의 stirng 메소를 잘 활용한 것 같다

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb =new StringBuilder();

        int N = Integer.parseInt(br.readLine());
        String pattern = br.readLine();
        String[] given = pattern.split("\\*");
        String first = given[0];
        String second = given[1];

        for (int i = 0 ; i< N ; i++) {
            String pb = br.readLine();
            if ( pb.length() >= first.length() + second.length() &&
                    pb.startsWith(first) && pb.endsWith(second)) {
                sb.append("DA\n");
            }else sb.append("NE\n");
        }
        System.out.println(sb);
    }
}

 

정규 표현식풀이

 

.* 를 활용한 풀이로

a*b는 a가 0번이상 반복후 b한번 

a.*b가 우리가 원하는 형태이다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        // 입력: 첫 줄에는 N과 패턴
        int N = Integer.parseInt(br.readLine());
        String[] inputs = br.readLine().split("\\*");
 
        // 정규표현식 변환: "*"을 ".*"로 변경
        Pattern pattern = Pattern.compile(inputs[0]+".*"+inputs[1]);
       

        for (int i = 0; i < N; i++) {
            String testString = br.readLine();
            Matcher mac = pattern.matcher(testString);
            
            if (mac.matches()) {
                sb.append("DA\n"); // 패턴 매칭 성공
            } else {
                sb.append("NE\n"); // 패턴 매칭 실패
            }
        }

        System.out.print(sb); // 결과 출력
    }
}