대문자 알파벳 26개만 입력값으로 주어지기에, 26개의 배열을 만들어 A부터 Z까지 각각 0~25의 인덱스로 설정하여 알파벳 개수를 요소로 설정한다.
따라서 Swift의 경우에는 asciiValue와 Unicode.Scalar를, Python의 경우에는 ord와 chr를 적절히 설정하여 알파벳에 해당하는 인덱스를 알맞게 접근해야 한다.
문자의 개수가 홀수인 문자는 0 또는 1이어야 한다.
펠린드롬에서 알파벳 개수가 홀수인 문자는 무조건 펠린드롬의 가운데 글자가 되어야 한다.
만약 개수가 홀수인 문자가 2개 이상이면, 해당 글자 모두 정가운데에 위치해야 하는데 그러면 펠린드롬이 성립할 수가 없다.
코드
Swift
import Foundation
func solution(_ word: String) -> String {
// 알파벳 A~Z의 개수에 해당하는 배열 할당
var countArray = Array(repeating: 0, count: 26)
// 문자의 개수가 홀수인 문자와 그에 대한 플래그 초기화
var oddCharacter = ""
var oddCharFlag = 0
// 결괏값 초기화
var result = ""
// 주어진 단어를 반복하여 알파벳 개수에 대한 배열을 입력
for char in word {
let asciiIndex = Int(char.asciiValue!) - 65
countArray[asciiIndex] += 1
}
for i in 0..<countArray.count {
// 해당 문자의 개수의 절반만큼 결괏값에 연결
let halfCount = countArray[i] / 2
for _ in 0..<halfCount {
result += String(Unicode.Scalar(i + 65)!)
}
// 문자의 개수가 홀수인 문자가 있으면 해당 문자와 상태를 업데이트
if countArray[i] % 2 == 1 {
oddCharacter = String(Unicode.Scalar(i + 65)!)
oddCharFlag += 1
}
}
// 문자의 개수가 홀수인 문자의 수가 1을 넘으면 팰린드롬이 아니므로 에러 출력
if oddCharFlag > 1 {
result = "I'm Sorry Hansoo"
} else { // 반쪽 길이에 문자 개수가 홀수인 문자(없을 경우 공백)와 반쪽의 정반대를 연결
result += oddCharacter + String(result.reversed())
}
// 결괏값 출력
return result
}
let input = readLine()!
print(solution(input))
Python
import sys
def solution(word):
alpha_count = [0 for _ in range(26)]
odd_alpha = ""
half_word = ""
result = ""
for char in word:
alpha_count[ord(char) - 65] += 1
for i in range(26):
alphabet = chr(i + 65)
if alpha_count[i] % 2 == 1:
odd_alpha += alphabet
for _ in range(alpha_count[i] // 2):
half_word += alphabet
if len(odd_alpha) > 1:
result = "I'm Sorry Hansoo"
else:
result += half_word + odd_alpha + half_word[::-1]
return result
# sys.stdin = open("input.txt", "r")
# input = sys.stdin.readline
word = input()
print(solution(word))
댓글