본문 바로가기
Algorithm & SQL/BAEKJOON

백준 JAVA 9996 한국이 그리울 땐 서버에 접속하지

by YoonJong 2022. 9. 1.
728x90

예외적인 부분이 많았던 것 같다.

왜 정답률이 낮지? 했는데 막상 풀어보니 예제에 없는 예시를 꼭 생각해봐야했던 문제였다.

예제에 없는 예시는 질문검색에서 참고해서 대입했다.

 


// 예외처리 ( str의 길이가 s 보다 크면 NE 출력 후 break
if ( str.length() -1 > s.length()) {
    System.out.println("NE");
    break;
}

 

예외처리한 부분

 

// * 앞쪽 비교
for (int j = 0; j < idx; j++) {
    if (str.charAt(j) != s.charAt(j)) {
        check = false;
    }
}

앞쪽은 쉽게 비교할 수 있다. 0부터~  시작한다.

 

 

// * 뒤쪽 비교
int back = ((str.length() - 1) - idx); // 1
ArrayList<Character> list1 = new ArrayList<>();
ArrayList<Character> list2 = new ArrayList<>();
for (int j = str.length() - 1; j > str.length() - back - 1; j--) {
    list1.add(str.charAt(j));
}

for (int j = s.length() - 1; j > s.length() - back - 1; j--) {
    list2.add(s.charAt(j));
}

if (!list1.equals(list2)) {
    check = false;
}

뒤쪽을 비교해야하는데, 여기서 어떻게 구현해야하나 생각하다가 결국 List 를 2개만들어서 비교했다.

각각의 문자열이 길이가 다르기때문이다.

또한, * 에서부터 마지막 값까지 몇개의 문자가 있는지 구하기 위해 back 이라는 변수를 만들었다.

 

if (check == false) {
    System.out.println("NE");
} else {
    System.out.println("DA");
}

check = true;
break;

마지막으로, check 가 false 일때 true 일때를 구분해서 출력한 후, check 를 입력받기 전에 초기화했기 때문에,

다시 true 로 초기화한 후 while 문을 빠져나가게 구현했다.


package BAEKJOON.Silver.Ⅲ;

import java.util.ArrayList;
import java.util.Scanner;

/**
 * 시간 제한   메모리 제한 제출 정답 맞힌 사람  정답 비율
 * 1 초 128 MB 9525   2630   2064   27.396%
 */
public class NO9996 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        String str = sc.next();
        boolean check = true;

        int idx = str.indexOf('*');

        for (int i = 0; i < n; i++) {
            String s = sc.next();

            while (true) {
                // 예외처리 ( str의 길이가 s 보다 크면 NE 출력 후 break 
                if ( str.length() -1 > s.length()) {
                    System.out.println("NE");
                    break;
                }

                // * 앞쪽 비교
                for (int j = 0; j < idx; j++) {
                    if (str.charAt(j) != s.charAt(j)) {
                        check = false;
                    }
                }

                // * 뒤쪽 비교
                int back = ((str.length() - 1) - idx); // 1
                ArrayList<Character> list1 = new ArrayList<>();
                ArrayList<Character> list2 = new ArrayList<>();
                for (int j = str.length() - 1; j > str.length() - back - 1; j--) {
                    list1.add(str.charAt(j));
                }

                for (int j = s.length() - 1; j > s.length() - back - 1; j--) {
                    list2.add(s.charAt(j));
                }

                if (!list1.equals(list2)) {
                    check = false;
                }

                if (check == false) {
                    System.out.println("NE");
                } else {
                    System.out.println("DA");
                }

                check = true;
                break;
            }
        }

    }
}
728x90

댓글