본문 바로가기
알고리즘 문제 풀이/완전탐색

백준 - 팰린드롬

by 가나무마 2021. 12. 30.
728x90

본 알고리즘 풀이는 Routine Study에서 진행하고 있습니다.
저를 포함한 구성원이 대부분 초보이므로, 원하시는분은 언제라도 들어오셔도 좋습니다.

문의는 댓글 바람.

문제 출처 : https://www.acmicpc.net/problem/8892

단어 k개 중에서 2개를 붙였을 때, 그 수가 팰린드롬(앞에서 읽는 거랑 뒤에서 읽는 거랑 같으면)이면 그 문자를 출력하고, 없으면 0을 출력하시오.

 

[접근 방법]

언뜻 보면 k개의 단어 중 2개를 선택하는 순열 문제 같지만,

만약에 ab aba가 단어로 주어지면 ab+aba => ababa는 팰린드롬이지만 abaab는 팰린드롬이 아니다.

따라서 kC2(조합)가 아닌 kP2(순열)가 된다.

그러므로 시간 복잡도는 O(kP2).

kP2를 단순화하면 k!/(k-2)! => (k)(k-1)이므로 O(k^2-k) 시간복잡도는 최고차항만을 남기므로 시간복잡도는 O(k^2)이 된다.

 

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

public class Main {
    //    static int k = 2;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int cntOfTestcase = Integer.parseInt(br.readLine());
        for (int i = 1; i <= cntOfTestcase; i++) {
            int cntOfWords = Integer.parseInt(br.readLine());
            String[] words = new String[cntOfWords];
            for (int wordNo = 1; wordNo <= cntOfWords; wordNo++) {
                words[wordNo-1] = br.readLine();
            }

            if (!checkPalindrome(words)) System.out.println(0);
        }
    }

    private static boolean checkPalindrome(String[] words) {
        // 두 개를 선택하는 경우의 수 반복문
        for (int i = 0; i < words.length-1; i++) {
            for (int j = i+1; j < words.length; j++) {
                // 앞뒤를 번갈아가면서 붙여서 팰린드롬인지 체크
                String str = words[i].concat(words[j]);
                if (isPalindrome(str)) {
                    System.out.println(str);
                    return true;
                }

                str = words[j].concat(words[i]);
                if (isPalindrome(str)) {
                    System.out.println(str);
                    return true;
                }
            }
        }

        return false;
    }

    // 팰린드롬 체크하는 메서드
    private static boolean isPalindrome(String str) {
        for (int i = 0; i <= str.length()/2-1; i++) {
            if (str.charAt(i) != str.charAt(str.length()-i-1)) {
                return false;
            }
        }

        return true;
    }
}

[느낀 점]

조합을 구현해봐야겠다.

이것 단지 2개를 선택하는 거라 이중for문을 사용하여 단순하게 끝났지만, 만약 3개나 4개였다면 더 힘들었을 거다.

조합을 구현해보자.

728x90
반응형

'알고리즘 문제 풀이 > 완전탐색' 카테고리의 다른 글

백준 - 마인크래프트  (0) 2021.12.31
백준 - 꽃길  (0) 2021.12.31
백준 - 영화감독 숌  (0) 2021.12.25
백준 - 체스판 다시 칠하기  (0) 2021.12.25
백준 - 유레카 이론  (0) 2021.12.22