백준/문제

30458번: 팰린드롬 애너그램

스몰스테핑 2024. 9. 6. 16:28

 

문제 출처 : https://www.acmicpc.net/problem/30458

 

언어 : Kotlin

 

문제 설명 :

팰린드롬이란 앞으로 읽어도, 뒤로 읽어도 같은 문자열을 의미한다. 예를 들어, radar는 팰린드롬이지만, konkuk은 팰린드롬이 아니다.

알파벳 소문자로만 이루어진 길이 N의 문자열 S가 주어진다. 문자열에 아래 연산을 0회 이상 수행해서 팰린드롬으로 만들 수 있을까?

문자열의 왼쪽 $\left\lfloor \frac{N}{2} \right\rfloor$개 문자 중 하나와 오른쪽 $\left\lfloor \frac{N}{2} \right\rfloor$개 문자 중 하나를 골라 서로 위치를 바꾼다.

 

입력 :

첫째 줄에 문자열의 길이를 나타내는 정수 $N$이 주어진다. $\left( 3\leq N\leq 200\, 000 \right)$ 
둘째 줄에 길이 $N$의 문자열 $S$가 주어진다. $S$는 알파벳 소문자로만 이루어져 있다.

 

출력 :

주어진 연산을 $0$회 이상 수행해서 팰린드롬으로 만들 수 있다면 Yes를, 만들 수 없다면 No를 출력한다.

 

제한 사항 :

  • 시간 제한 : 2초
  • 메모리 제한 : 512MB

 

입출력 예 :

입력 출력
11
abracadabra
No
11
abracacabra
Yes

 

풀이 : 

import java.io.BufferedWriter
import java.io.OutputStreamWriter
import kotlin.system.exitProcess

fun main() = with(System.`in`.bufferedReader()) {
    val bw = BufferedWriter(OutputStreamWriter(System.out))

    val n = readLine().toInt()
    val s = readLine()

    val cnt = IntArray(26)
    for (i in s.indices) {
        cnt[s[i] - 'a']++
    }
    
    if (n % 2 == 1) {
        cnt[s[n / 2] - 'a']--
    }
    
    for (i in 0 until 26) {
        if (cnt[i] % 2 == 1) {
            bw.write("No")
            bw.flush()
            exitProcess(0)
        }
    }
    
    bw.write("Yes")
    bw.flush()
    bw.close()
}