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

[백준] (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))

 

댓글