https://www.acmicpc.net/problem/1213
1213번 팰린드롬 만들기 문제 링크입니다.
핵심
팰린드롬수에서 핵심은 홀수인 문자가 2개 이상 나오면, 팰린드롬을 만들 수가 없다.
앞의 출력과 뒤의 출력의 순서가 반대이므로 reverse() 메서드를 사용하면, 쉽게 구할 수 있다.
정답 코드
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));
StringBuilder sb = new StringBuilder();
String str = br.readLine();
int[] arr = new int[26];
for (int i = 0; i < str.length(); i++) {
int index = str.charAt(i) - 'A';
arr[index]++;
}
int odd = 0;
int num = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] % 2 != 0) {
odd++;
num = i;
}
if (odd >= 2) {
System.out.println("I'm Sorry Hansoo");
return;
}
}
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i] / 2; j++) {
sb.append((char)(i+'A'));
}
}
String result = sb.toString();
if (odd == 1) {
result += (char) (num + 'A');
}
result += sb.reverse().toString();
System.out.println(result);
}
}
해설
int타입의 배열 arr를 26의 크기로 잡은 것은, 알파벳이 A~Z까지 총 26개 이기 때문이다.
for문의 통해 실제 입력받은 알파벳의 개수를 A부터 0번째 자리에 나온 횟수만큼 순차적으로 넣어준다.
odd라는 변수를 생성하는데, 이는 홀수의 개수를 찾는 데 사용된다.
홀수가 1개이면, 그 위치를 num값에 넣어준다. 만약 2개 이상이라면 오류를 출력한다.
이후 반복문을 통해 입력받은 알파벳의 개수의 절반만 먼저 출력해준다.
예를 들면 AAAABBBB라고 생각하면, AABB가 출력되는 것이다.
sb.append를 하면, StringBuilder에 저장되는데 추가되는데,
sb를 사용하는 이유는 reverse를 사용하기 위해서이다.
흔히 하는 착각 중 하나는
result +=sb.append((char)(i+'A'));라고 써도 될 것이라 생각한다.
이 부분의 실행 과정을 볼 필요가 있다. 우선 sb에 새로운 값이 추가되고, 그 값을(sb) result에 넣는 형식이다.
따라서 for문 안에서 result에 넣게 되면, AABB가 입력된다고 했을 때, A가 추가되고, 이후 B가 추가되는데,
result에는 AAB가 저장된다.
이후 홀수를 중간에 추가해줘야 한다.
홀수가 있다면, 그 값을 result에 추가해준다.
마지막으로 뒷부분을 result에 저장해주어야 한다.
이미 앞부분을 구했으므로, 그 부분의 정반대인 sb.reverse()를 사용하게 되면, sb값이 반대로 되게 된다.
개선점이나 오류가 있다면, 댓글 부탁드립니다.
'PS > 알고리즘 문제풀이' 카테고리의 다른 글
*완전탐색* colorpaper (0) | 2022.09.14 |
---|---|
*완전 탐색* rook(java,알고리즘) (2) | 2022.09.11 |
*배열* arr3 (java, 알고리즘) (0) | 2022.09.04 |
*다중 반복문* 숫자 피라미드(java, 알고리즘) (0) | 2022.09.04 |
[백준]1302번 베스트셀러(java) (0) | 2022.09.04 |