문제
풀이
규칙에 따라 알파벳을 배치해주면 된다.
먼저 입력받은 문자열에서 각 알파벳이 몇 개 포함되어 있는 지를 배열에 저장한다. 그 후 문자열의 길이가 홀수인지 짝수인지에 따라 다음의 규칙으로 알파벳을 배치한다.
만약 문자열의 길이가 짝수라면, 모든 알파벳의 갯수가 짝수여야 한다. 알파벳의 갯수를 반으로 나눠 앞부분과 뒷부분에 배치해준다.
만약 문자열의 길이가 홀수라면, 하나의 알파벳만 홀수여야 한다. 해당 알파벳은 중간에 배치하고 나머지 알파벳들은 반으로 나눠서 앞과 뒤에 배치한다.
알파벳의 배치가 완료되면 시작 문자열 + 중간 문자열 + 끝 문자열을 뒤집은 것을 출력해 펠린드롬을 만들어 주면 된다.
코드
fun main() {
val br = System.`in`.bufferedReader()
val bw = System.out.bufferedWriter()
val line = br.readLine().toString()
val alphabet = IntArray(26)
line.forEach { alphabet[it.code-65]++ }
var front = ""
var mid = ""
var back = ""
var check = false
if(line.length % 2 == 0) { // 짝수인 경우
for(i in 0 until 26) {
if(alphabet[i] == 0) continue
if(alphabet[i]%2 != 0) { // 알파벳이 홀수면 불가능
check = true
break
}
for(j in 0 until alphabet[i]/2) {
front += (i + 65).toChar()
back += (i + 65).toChar()
}
}
} else { // 홀수인 경우
for(i in 0 until 26) {
if(alphabet[i] == 0) continue
if(alphabet[i]%2 != 0 && mid.isNotEmpty()) { // 홀수인 알파벳이 여러 개면 불가능
check = true
break
}
for(j in 0 until alphabet[i]/2) {
front += (i + 65).toChar()
back += (i + 65).toChar()
}
if(alphabet[i]%2 != 0) {
mid += (i + 65).toChar()
}
}
}
bw.write(if(check) "I'm Sorry Hansoo" else front + mid + back.reversed())
bw.flush()
bw.close()
br.close()
}
'알고리즘 > Baekjoon' 카테고리의 다른 글
[백준] 10451번: 순열 사이클 - Kotlin[코틀린] (0) | 2023.12.19 |
---|---|
[백준] 1072번: 게임 - Kotlin[코틀린] (0) | 2023.12.19 |
[백준] 1449번: 수리공 항승 - Kotlin[코틀린] (0) | 2023.12.17 |
[백준] 13023번: ABCDE - Kotlin[코틀린] (0) | 2023.12.16 |
[백준] 2669번: 직사각형 네개의 합집합의 면적 구하기 - Kotlin[코틀린] (0) | 2023.12.13 |