내일배움캠프 D+42
BAEKJOON _ NO.2941 "크로아티아 알파벳"
<문제>
입력된 임의의 문자열을 아래 표에 해당되는 크로아티아 단어로 변환한 뒤 문자열의 길이를 출력해 주면 된다. (크로아티아 문자가 dž로 되었으면 2의 길이가 아닌 1의 길이로 계산하고, 변환하지 않은 문자는 1의 길이로 계산해 주면 된다.)
<풀이>
-
크로아티아 알파벳 구분하기.
[ 정규식 ]
-
p = re.compile('(d)?([a-z])([=j-])')
(d)? : 첫번째 문자열이 "d"여도 되고 아니어도 된다.
([a-z]) : 두번째 문자열이 알파벳 소문자로 이루어져 있나 확인한다.
([=j-]) : 세번째 문자열이 "=","j","-" 인지 확인한다. -
k = p.findall(word)
"word"변수에 들어오는 문자열을 정규식(p : 위 조건)과 매치되는지 확인한 뒤
해당되는 문자를 k에 리스트 형식으로 저장된다.( findall : 정규식과 매치하여 리스트로 돌려준다.)
-
크로아티아 알파벳이 맞는지 비교 후 계산
[ 리스트(k)를 크로아티아 문자와 비교해 준다. ]
- if
"dz="이 있는지 없는지 확인한 후 있을 경우 "count += 2"를 해준다.
- elif
크로아티아 문자 (c=, c-, d-, lj, nj, s=, z=)와 비교 후 "count += 1"를 해준다.
- 문자열 출력을 위한 계산.
- "dz="을 "dž"로 변환하면서 기존 문자열의 길이가 3에서 1이 된다. (count += 2)
- "dz="을 제외한 크로아티아 문자는 문자열의 길이가 2에서 1이 된다. (count += 1)
- 계산법 : "len(word) - count" 입력된 문자열의 길이에서 변환하며 차이나는 만큼의 count값을 빼주면 변환 후의 문자열의 길이가 나온다.
작성 코드 보기
import re
alphabet_list = ["c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="]
word = input()
count = 0
p = re.compile('(d)?([a-z])([=j-])')
k = p.findall(word)
for i in k:
print("i = ", i)
alphabet = i[0] + i[1] + i[2]
if alphabet == "dz=":
count += 2
print("조건1 = ", alphabet[1:2])
elif i[1] + i[2] in alphabet_list:
count += 1
print("조건2 = ", i[1] + i[2])
print(len(word) - count)
※ 문제를 다 푼 뒤 다른 해법을 찾아보던 중 더 깔끔한 코드를 발견 했다.
import re
print(len(re.sub("(dz=|c=|c-|d-|lj|nj|s=|z=)", "0", input())))
- input()으로 받은 문자열에서 re.sub()를 통해 "(dz=|c=|c-|d-|lj|nj|s=|z=)" 안의 문자가 있으면 "0"으로 치환해 준 뒤 len()으로 길이를 계산해 준다.
배운 부분.
- 정규식은 필요한 부분의 코드만 따로 사용하였는데 이번 문제를 통해 정규식을 작성하는 방법과 활용하는 방법을 터특하게 되었다.
- 좀 더 정규식 이론을 넓게 봤으면 sub()과 같은 함수를 알아 더 쉽게 해결 할 수 있었을 것이라는 아쉬움이 있다.
Author And Source
이 문제에 관하여(내일배움캠프 D+42), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yu_jep/내일배움캠프-D42저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)