본문 바로가기
코딩 테스트/백준

[백준] (Swift/Python) 1213번: 펠린드롬 만들기

by Dev.Andy 2023. 5. 16.

백준 문제 이미지 - 1213번: 팰린드롬 만들기

1213번: 팰린드롬 만들기

 

풀이

알파벳 26개를 인덱스로 갖는 배열 만들기

  • 대문자 알파벳 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))

 

댓글