[백준] 1545. 안티 팰린드롬 (Java)

서재·2025년 11월 28일

백준 알고리즘 풀이

목록 보기
47/49

👨‍💻 문제

모든 자리의 알파벳이 중심을 기준으로 대칭이 되지 않도록 주어진 문자열을 재배치하는 문제

사전 순으로 가장 앞서도록


✍️ 풀이

📊 알파벳 세기

문자열을 구성하는 알파벳의 수를 센다.

        int[] alphabets = new int[26];
        for (char c : input.toCharArray()) {
            alphabets[c - 'a']++;
        }

🇦🇧🇨 문자열 구성

주어진 알파벳으로 문자열을 구성한다.

  • 수량이 남아있는 알파벳으로 채운다.
  • 사전 순으로 앞서는 알파벳부터 채워본다.
  • 대칭이 되는 인덱스에 같은 알파벳이 할당되지 않도록 한다.
        int N = input.length();
        int[] answer = new int[N];
        for (int i=0; i<N; i++) {
            answer[i] = -1;
        }
        loop: for (int i=0; i<N; i++) {
            for (int j=0; j<26; j++) {
                if (alphabets[j] > 0 && answer[N - 1 - i] != j) {
                    answer[i] = j;
                    alphabets[j]--;
                    continue loop;
                }
            }
            System.out.println(-1);
            return;
        }

📄 전체 소스코드

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

public class _1545 {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = br.readLine();

        int[] alphabets = new int[26];
        for (char c : input.toCharArray()) {
            alphabets[c - 'a']++;
        }

        int N = input.length();
        int[] answer = new int[N];
        for (int i=0; i<N; i++) {
            answer[i] = -1;
        }
        loop: for (int i=0; i<N; i++) {
            for (int j=0; j<26; j++) {
                if (alphabets[j] > 0 && answer[N - 1 - i] != j) {
                    answer[i] = j;
                    alphabets[j]--;
                    continue loop;
                }
            }
            System.out.println(-1);
            return;
        }

        StringBuilder sb = new StringBuilder();
        for (int i : answer) {
            sb.append((char)(i + 'a'));
        }
        System.out.println(sb);
    }

}
profile
입니다.

0개의 댓글