[BOJ] 1213. 팰린드롬 만들기

Jimeaning·2023년 4월 26일
1

코딩테스트

목록 보기
82/143

Python3

문제

https://www.acmicpc.net/problem/1213

키워드

  • 구현

문제 풀이

문제 요구사항

  • 정답이 여러 개일 경우에는 사전순으로 앞서는 것을 출력한다.
    => 문자열을 사전순으로 정렬하는 과정이 필요하다.
  • 문자열에서 두 개 이상의 홀수 알파벳이 있으면 팰린드롬을 만들지 못한다.
    => 홀수 개가 두 개 이상인지 확인해야 한다.

변수 및 함수 설명

  • s: 이름을 입력받는 문자열이다. 알파벳 대문자로만 된 최대 50글자이다.
    입력받은 후 사전순으로 정렬한다.
  • cnt: 알파벳의 개수를 담는 리스트이다.
  • odd: 알파벳 개수 중 홀수를 세는 변수이다.
  • str_odd: 홀수 개의 알파벳들을 저장하는 문자열이다.
  • alp: 짝수 알파벳을 저장하는 문자열이다.

풀이

(입력받기)

  • 문자열 s를 입력받고 오름차순으로 정렬한다.

(반복문(단어 크기만큼))

  • 문자열에 있는 알파벳을 세서 cnt 리스트에 넣는다.

    ord 함수
    특정한 문자를 아스키 코드 값으로 바꿔주는 함수이다.
    ex) ord('A') = 65


    chr 함수
    아스키 코드 값을 해당하는 문자로 바꿔주는 함수이다.
    ex) chr(65) = 'A'

(반복문(알파벳 총 개수만큼(26)))

  • 만약 cnt[i]의 값이 홀수라면,
    - 홀수를 세는 변수인 odd 크기를 1 늘리고
    • str_odd에 해당 알파벳을 넣는다.
  • alp에 짝수 알파벳을 (해당 개수 // 2)개씩 넣는다.
    => 최종 출력이 짝수 알파벳 + 홀수 알파벳 + 짝수 알파벳의 역순으로 나와야 하기 때문

(최종 출력)

  • 만약 홀수 개가 2개 이상이라면, I'm Sorry Hansoo를 출력한다.
  • 짝수 알파벳 + 홀수 알파벳 + 짝수 알파벳의 역순을 출력한다.

최종 코드

s = input()
s = sorted(s)
cnt = [0] * 26

odd = 0
str_odd = ''
alp = ''

for i in s:
    cnt[ord(i)-65] += 1

for i in range(26):
    if cnt[i] % 2 == 1:
        odd += 1
        str_odd += chr(i+65)
    alp += chr(i+65) * (cnt[i] // 2)
    
if odd > 1:
    print('I\'m Sorry Hansoo')
else:
    print(alp + str_odd + alp[::-1])

(+ 2024.02.19 추가)

from collections import Counter

str = list(input())
str.sort()
cnt = Counter(str)
odd = 0
ans = ''

for i in cnt:
    if cnt[i] % 2 != 0:
        odd += 1
        odd_char = i
    for _ in range(cnt[i] // 2):
        ans += i

if odd > 1:
    print("I'm Sorry Hansoo")
elif odd == 0:
    print(ans + ans[::-1])
else:
    print(ans + odd_char + ans[::-1])

Counter 메서드 충격적으로다가 편하네 ,,
str을 Counter로 출력하면 입력값이 ABACABA일 때,

Counter({'A': 4, 'B': 2, 'C': 1})

이렇게 소팅해서 나온다

profile
I mean

0개의 댓글