백준 문제 풀이 (1213번) java

tae_in·2022년 9월 7일
0

알고리즘

목록 보기
11/12

문제

https://www.acmicpc.net/problem/1213

풀이

이 문제는 가운데를 기준으로 양옆이 같도록 출력하는 문제이다. 규칙을 찾아보면 홀수가 2개 이상나오는 순간 좌우가 대칭이 될수 없다는 것을 알수 있다. 대문자로 입력 받으므로 배열을 효율적으로 사용하기 위해 'A'를 빼줘서 0 ~ 25까지의 배열을 선언하여 사용하지 않는 배열이 없도록 작성하였다. 그리고 담긴 배열을 보면 홀수가 2개이면 대칭이 될 수 없으므로 최대 1값만 홀수이고 나머지는 짝수일 것이다. 그래서 인덱스에 담긴 값을 반으로 나누어서 해당 문자를 StringBuilder를 생성하여 문자를 넣는다.

(ex) A라는 문자가 2번 들어왔다. -> 이를 2로 나누면 1이니 한 번만 StringBuilder를 사용하여 A를 넣는다.(sb.append(A)))

StringBuilder에는 reverse()라는 메서드가 있다. 이를 이용하면 가운데를 기준으로 오른쪽 값을 찾기 위한 코드를 작성할 필요가 없어진다.

StringBuilder sb = new StringBuilder();
sb.append('AB');
System.out.println(sb); // AB
sb.reverse();
System.out.println(sb); // BA

만약 홀수가 존재한다면 입력받은 문자열은 홀수개의 문자로 구성되어 있을 것이다. 그러면 가운데 값이 존재하므로 위의 코드들로는 구현할 수 없게된다. 위의 코드들은 짝수만 커버하는 코드이다.

if (odd == 1) {
           st += (char) (num + 'A');
       }
       
       st += sb.reverse().toString(); // StringBuilder sb를 문자열로 바꾸려면 toString 메서드를 사용해야한다.
       System.out.println(st);

그래서 미리 왼쪽 문자를 담고 이를 String 변수(st)에 저장한 후에 odd가 1이면 홀수의 인덱스(num)에 'A'를 더하고 char로 형변환을 해줘 원래 입력값으로 받았던 가운데 문자를 추가해준다. 이후 reverse메서드를 문자열 st에 추가해주어 대칭이되는 문자열을 만들고 출력해준다.

코드

package Category;

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

public class q_1213 {

    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 st = sb.toString();
        if (odd == 1) {
            st += (char) (num + 'A');
        }

        st += sb.reverse().toString();
        System.out.println(st);


    }
}

0개의 댓글