내일배움캠프 D+42

BAEKJOON _ NO.2941 "크로아티아 알파벳"


<문제>

입력된 임의의 문자열을 아래 표에 해당되는 크로아티아 단어로 변환한 뒤 문자열의 길이를 출력해 주면 된다. (크로아티아 문자가 dž로 되었으면 2의 길이가 아닌 1의 길이로 계산하고, 변환하지 않은 문자는 1의 길이로 계산해 주면 된다.)


<풀이>

  1. 크로아티아 알파벳 구분하기.

    [ 정규식 ]

  • p = re.compile('(d)?([a-z])([=j-])')
    (d)? : 첫번째 문자열이 "d"여도 되고 아니어도 된다.
    ([a-z]) : 두번째 문자열이 알파벳 소문자로 이루어져 있나 확인한다.
    ([=j-]) : 세번째 문자열이 "=","j","-" 인지 확인한다.

  • k = p.findall(word)
    "word"변수에 들어오는 문자열을 정규식(p : 위 조건)과 매치되는지 확인한 뒤
    해당되는 문자를 k에 리스트 형식으로 저장된다.( findall : 정규식과 매치하여 리스트로 돌려준다.)

  1. 크로아티아 알파벳이 맞는지 비교 후 계산

    [ 리스트(k)를 크로아티아 문자와 비교해 준다. ]

  • if
    "dz="이 있는지 없는지 확인한 후 있을 경우 "count += 2"를 해준다.
  • elif
    크로아티아 문자 (c=, c-, d-, lj, nj, s=, z=)와 비교 후 "count += 1"를 해준다.
  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()과 같은 함수를 알아 더 쉽게 해결 할 수 있었을 것이라는 아쉬움이 있다.

좋은 웹페이지 즐겨찾기