문제
임한수와 임문빈은 서로 사랑하는 사이이다.
임한수는 세상에서 팰린드롬인 문자열을 너무 좋아하기 때문에, 둘의 백일을 기념해서 임문빈은 팰린드롬을 선물해주려고 한다.
임문빈은 임한수의 영어 이름으로 팰린드롬을 만들려고 하는데, 임한수의 영어 이름의 알파벳 순서를 적절히 바꿔서 팰린드롬을 만들려고 한다.
임문빈을 도와 임한수의 영어 이름을 팰린드롬으로 바꾸는 프로그램을 작성하시오.
입력
첫째 줄에 임한수의 영어 이름이 있다. 알파벳 대문자로만 된 최대 50글자이다.
출력
첫째 줄에 문제의 정답을 출력한다. 만약 불가능할 때는 "I'm Sorry Hansoo"를 출력한다. 정답이 여러 개일 경우에는 사전순으로 앞서는 것을 출력한다.
예제 입력 1
AABB
예제 출력 1
ABBA
예제 입력 2
AAABB
예제 출력 2
ABABA
예제 입력 3
ABACABA
예제 출력 3
AABCBAA
예제 입력 4
ABCD
예제 출력 4
I'm Sorry Hansoo
접근 방법 🧐
팰린드롬은 문자들이 좌우 대칭인 문자열을 말하는데,
이 문제를 풀 때 핵심 아이디어는 개수가 홀수인 문자가 2개 이상 나오면, 팰린드롬을 만들 수가 없다는 것이다.
이 아이디어를 바탕으로 접근하면 알고리즘은 다음과 같다.
1. 알파벳 개수를 저장하는 배열 letters를 선언 및 초기화한다.
2. 입력받은 문자열의 알파벳 대문자가 각각 몇 개인지 letters에 저장한다.
3. 개수가 홀수인 문자의 개수를 저장하는 oddNumberCount와 해당 문자의 인덱스를 저장하는 middleIndex를 선언하고, for문 루프를 돌려서 letters 원소가 홀수인지 검사한다.
4-1. oddNumberCount가 2 이상이면 "I'm Sorry Hansoo"를 출력하고 리턴한다.
4-2. oddNumberCount가 1 미만이면 StringBuilder를 활용해서 앞 뒤 문자열을 구하고, oddNumberCount가 1인 경우에는 middleIndex도 append하면 된다.
내가 쓴 코드 ✍️
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String name = br.readLine();
int[] letters = new int[26];
for (int i = 0; i < name.length(); i++) {
int index = name.charAt(i) - 'A';
letters[index]++;
}
int oddNumberCount = 0;
int middleIndex = 0;
for (int i = 0; i < 26; i++) {
if (letters[i] % 2 != 0) {
oddNumberCount++;
middleIndex = i;
}
}
if (oddNumberCount >= 2) {
System.out.println("I'm Sorry Hansoo");
return;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 26; i++) {
for (int j = 0; j < letters[i] / 2; j++) {
sb.append((char)('A' + i));
}
}
String front = sb.toString();
if (oddNumberCount == 1) front += (char)(middleIndex + 'A');
String back = sb.reverse().toString();
String answer = front + back;
System.out.println(answer);
}
}
구독과 공감은 블로그 운영에 큰 힘이 됩니다! ♡
긍정적인 댓글 남겨주시면 감사드리며,
보완해야 할 점이 있으면 댓글로 남겨주셔도 좋습니다!
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 10971. 외판원 순회 2 (자바 JAVA) (1) | 2025.02.13 |
---|---|
[백준] 10971. 외판원 순회 2 (자바 JAVA) (3) | 2025.02.08 |
[백준] 7576. 토마토 (자바 JAVA) (2) | 2025.01.31 |
[백준] 2805. 나무 자르기 (자바 JAVA) (2) | 2025.01.30 |
[백준] 1339. 단어 수학 (자바 JAVA) (2) | 2025.01.28 |