본문 바로가기

알고리즘/문제 풀이

[백준] 30458 팰린드롬 애너그램 java 풀이

1. 문제 설명

문제 링크

문자열이 주어졌을 때, 해당 문자열의 왼쪽에서부터 N/2개의 문자, 오른쪽에서부터 N/2개의 문자를 각각 군집화 한다.
(만약 N/2가 소수점을 가지면 내림한다.)

각 군집에서 문자를 서로 교환하였을 때, 펠린드롬 문자가 만들어지면 Yes , 어떻게 해도 안되면, No를 출력하라.

펠린드롬이란?
앞에서부터 읽어도, 뒤에서부터 읽어도 같은 문자열을 의미한다.
ex) 기러기, radar

2. 접근 방식

그냥 문제에서 주어진 그대로 풀면 된다.

  1. 문자열을 왼쪽에서부터 N/2 개의 문자, 오른쪽에서 부터 N/2 개의 문자로 나눈다.
  2. 각 문자들의 개수를 센다.
  3. 알파벳 별로 하나라도 문자가 짝수가 아니면, 아무리 바꿔도 펠린드롬이 되지 않는다. 이때는 No를 출력한다.
  4. 모든 알파벳의 개수가 짝수이다. Yes를 출력한다.

3. 코드 분석

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {

        HashMap<Character, Integer> map = new HashMap<>();

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        String s = br.readLine();

        for (int i = 0; i < (N/2); i++) {
            map.compute(s.charAt(i), (k, ov) -> map.get(k) == null? 1 : map.get(k)+1);
            map.compute(s.charAt(N-i-1), (k, ov) -> map.get(k) == null? 1 : map.get(k)+1);
        }

        for (char temp : map.keySet()){
            if (map.get(temp) % 2 != 0) {
                System.out.println("No");
                return;
            }
        }
        System.out.println("Yes");
    }
}

4. 성장 하기

나는 문제를 풀 때, map이란 자료구조를 활용하여 값을 집어넣었다.
다른 사람의 풀이를 보니 그냥 알파벳 전체를 대변하는 26개짜리 배열을 만들고, 거기에 value로 해당 알파벳이 나온 개수를 세는 경우 나보다 2배정도 빨랐다.

int [] alphabets = new int[26];        // 선언

alphabets[str.charAt(i) - 'a']++;     // 각 알파벳이 나온 횟수 세기