본문 바로가기
Algorithms/이코테

[구현] 이코테 - 문자열 재정렬(py)

by hi-rachel 2023. 7. 30.

문제

알파벳 대문자와 숫자(0 ~ 9)로만 구성된 문자열이 입력으로 주어집니다. 이때 모든 알파벳을 오름차순으로 정렬하여 이어서 출력한 뒤에, 그 뒤에 모든 숫자를 더한 값을 이어서 출력합니다.

예를 들어 K1KA5CB7이라는 값이 들어오면 ABCKK13을 출력합니다,

 

입력 조건

  • 첫째 줄에 하나의 문자열 S가 주어집니다. (1 <= S의 길이 <= 10,000)

출력 조건

  • 첫째 줄에 문제에서 요구하는 정답을 출력합니다.
입력 예시 출력 예시
K1KA5CB7 ABCKK13
AJKDLSI412K4JSJ9D ADDIJJJKKLSS20

풀이

 

- 내 풀이

import re

a = input()

n = re.findall(r'\d', a)
n_sum = 0

for i in n:
  n_sum += int(i)

abc = re.findall(r'[A-Z]', a)
abc.sort()

result = ''.join(abc)+str(n_sum)

print(result)

regex 정규표현식을 사용하여 숫자와 대문자를 나눠주고

숫자는 int로 하나하나 바꿔 합을 구해주고

대문자는 오름차순 정렬 후 list에서 다시 string으로 붙여주었다.

마지막 구한 정렬 문자와 숫자를 합해 출력

 

정규표현식 참고 : https://stackoverflow.com/questions/430079/how-to-split-strings-into-text-and-number

 

How to split strings into text and number?

I'd like to split strings like these 'foofo21' 'bar432' 'foobar12345' into ['foofo', '21'] ['bar', '432'] ['foobar', '12345'] Does somebody know an easy and simple way to do this in python?

stackoverflow.com

 

- 책 풀이

data = input()
result = []
value = 0

# 문자를 하나씩 확인하며
for x in data:
  # 알파벳인 경우 결과 리스트에 삽입
  if x.isalpha():
    result.append(x)
  # 숫자는 따로 더하기
  else:
    value += int(x)

# 알파벳을 오름차순으로 정렬
result.sort()

# 숫자가 하나라도 존재하는 경우 가장 뒤에 삽입
if value != 0:
  result.append(str(value))

# 최종 결과 출력 (리스트를 문자열로 변환하여 출력)
print(''.join(result))

isalpha() 메서드를 이용해 알파벳만 분리해 준 방법.

[] 하나에 알파벳 먼저 넣고 정렬한 후 숫자 합을 string으로 변환해 넣어줘 마지막에 같이 합쳐주었다.

+ 숫자가 하나라도 없을 경우를 고려해주었다!

 

내 풀이에서 숫자가 하나라도 없을 경우 0이 뒤에 붙어 출력되기 때문에 아래와 같이 수정이 필요하다.

import re

a = input()

n = re.findall(r'\d', a)
n_sum = 0

for i in n:
  n_sum += int(i)

abc = re.findall(r'[A-Z]', a)
abc.sort()

if n_sum != 0:
  abc.append(str(n_sum))

result = ''.join(abc)
print(result)

 

 

 


 

출처: 나동빈, 「이것이 취업을 위한 코딩테스트다 with 파이썬」, 한빛미디어, p.322