Algorithm/Greedy Algorithm

[백준 1213번] 팰린드룸 만들기(Java 풀이)

agility 2022. 3. 4. 14:27

백준알고리즘 1213번 : 팰린드룸 만들기

 

 

 

팰린드롬이란 회문, 즉 거꾸로 읽어도 같은 말이 되는 단어 혹은 문장을 말한다.

단어가 주어졌을 때 사전순으로 앞서는 팰린드롬을 만들고,

만들 수 없다고 판단되면 오류 메시지를 출력하는 문제이다.

단어가 홀수인 경우와 짝수인 경우로 나누어 풀었다.

 

풀이 과정


1. 사전순으로 출력되게 해야하므로, 배열을 받아 정렬한다.
2. 짝수인 경우에는 for문을 돌며 i번째와 i+1번째를 비교하여 StringBuilder로 append함과
  동시에 Stack에 push를 하고 두 문자가 다른 경우에는 즉시 오류 처리하며 종료하도록 했다.
   오류 처리가 되지 않은 경우에는 append한 String 값에 stack을 pop하여 단어를 추가 append하여
   출력하도록하였다.
3. 홀수인 경우가 조금더 복잡했는데, for문을 돌며 i번째와 i+1번째를 비교하되 달라도 한번은 
    ok한다.
    (대신 해당 값이 유일한 가운데 문자라는 전제하에 해당 단어를 별개의 String 변수로 담아둔다.)
    skip한 i번째 대신, 나머지 문자들끼리 비교할 수 있도록 i를 -1처리해준다.
   또 다른 경우가 발생한다면 즉시 오류 처리하며 종료하도록 한다.
   오류 처리가 되지 않은 경우에는 append한 String 값에 가운데 문제를 append하고, 최종적으로        stack을 pop하여 단어를 추가 append하여 출력하도록한다.

 

 

소스 ▽

더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Stack;

public class Main {// No1213 팰린드롬 만들기
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		String[] text = br.readLine().split("");
		Stack<String> stack = new Stack<>();

		Arrays.sort(text);

		a: if (text.length % 2 == 0) {
			for (int i = 0; i < text.length; i += 2) {
				if (text[i].equals(text[i + 1])) {
					sb.append(text[i]);
					stack.push(text[i]);
				} else {
					System.out.println("I'm Sorry Hansoo");
					break a;
				}
			}
			while (!stack.isEmpty()) {
				sb.append(stack.pop());
			}
			System.out.println(sb.toString());
		} else {
			String temp = "TMP";
			for (int i = 0; i < text.length - 1; i += 2) {
				if (text[i].equals(text[i + 1])) {
					sb.append(text[i]);
					stack.push(text[i]);
				} else if (temp.equals("TMP")) {
					temp = text[i];
					i--;
				} else {
					System.out.println("I'm Sorry Hansoo");
					break a;
				}
			}
			if (temp.equals("TMP")) {
				temp = text[text.length - 1];
			}
			sb.append(temp);
			while (!stack.isEmpty()) {
				sb.append(stack.pop());
			}
			System.out.println(sb.toString());
		}
	}
}