728x90
<문제>
https://www.acmicpc.net/problem/9996
9996번: 한국이 그리울 땐 서버에 접속하지
총 N개의 줄에 걸쳐서, 입력으로 주어진 i번째 파일 이름이 패턴과 일치하면 "DA", 일치하지 않으면 "NE"를 출력한다. 참고로, "DA"는 크로아티어어로 "YES"를, "NE"는 "NO"를 의미한다.
www.acmicpc.net
<풀이>
*를 기준으로 문자를 나눠서 저장한다.( * 앞부분을 front 뒷부분을 back으로 저장)
문제에서 NE가 뜰 경우의 수부터 생각을 한다. 첫 번째로 패턴에서 *을 제외한 길이보다 파일 이름이 더 짧으면 NE가 출력이 된다. 또 front와 * 앞까지의 글자가 다를 경우 NE를 출력하고 패턴에서 * 뒤부터 back까지 글자가 다를 경우 NE가 출력이 된다. 위 경우의 수에 포함되지 않으면 DA가 출력한다.
위 풀이를 코드로 작성하면 된다.
나는 빠른 풀이를 위해 NE와 DA를 체크하는 함수를 따로 구현을 해서 NE가 나오는 경우의수가 한 번만 나오면 뒤에는 확인 안 하고 바로 NE가 출력될 수 있도록 코드를 작성했다.
<코드>
import java.util.*;
import java.io.*;
public class Main {
public static char[] arr;
public static int point;
public static char[] front;
public static char[] back;
public static void main(String[] args)throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
arr = br.readLine().toCharArray();
point = 0;
for(int i = 0; i < arr.length; i++) {
if(arr[i]=='*'){
point = i;
break;
}
}
front = new char[point];
back = new char[arr.length - point - 1];
for(int i = 0; i < point; i++) {
front[i] = arr[i];
}
for(int i = 0; i < back.length; i++) {
back[i] = arr[point+1+i];
}
for(int i = 0; i < n; i++) {
char[] arr2 = br.readLine().toCharArray();
System.out.println(check(arr2));
}
}
public static String check(char[] arr2) {
if(arr.length-1 > arr2.length) {
return "NE";
}
for(int i = 0; i < front.length; i++) {
if(arr2[i] != front[i]) {
return "NE";
}
}
for(int i = 0; i < back.length; i++) {
if(arr2[arr2.length- back.length + i] != back[i]) {
return "NE";
}
}
return "DA";
}
}
728x90
'Algorithm > 백준 자바' 카테고리의 다른 글
백준 4949 자바 (0) | 2024.01.26 |
---|---|
백준 1620 자바 (0) | 2024.01.09 |
백준 11655 자바 (1) | 2024.01.03 |
백준 1159 자바 (0) | 2024.01.03 |
백준 10988 자바 (1) | 2024.01.03 |