[알고리즘] 백준 2941번 크로아티아 알파벳 찾기

Song·2021년 6월 14일
0

알고리즘

목록 보기
1/22

문제링크

문제 설명

  • 특수문자와 여러개의 알파벳이 하나의 문자로 이루어진 크로아티아 알파벳의 입력 개수를 구해라

주제

  • 문자열

난이도

나의 부끄러운 초반 코드

# input 값 받기
input_text = input()
# 문자 필터링 후 저장할 배열 선언
alphabets_arr = []

# 문자열만큼 반복문을 돌며 특정문자가 포함된 문자들은 하나의 문자열로 묶어주시
for i in range(len(input_text)):

    if input_text[i] in ('=', '-'):
        alphabets_arr.pop()

        if input_text[i] == '=' and input_text[i - 2] == 'd':
            alphabets_arr.pop()
            alphabets_arr.append(input_text[i - 2:i + 1])
        else:
            alphabets_arr.append(input_text[i - 1:i + 1])

    elif input_text[i] == 'j' and input_text[i - 1] in ('l', 'n'):
        alphabets_arr.pop()
        alphabets_arr.append(input_text[i - 1:i + 1])

    else:
        alphabets_arr.append(input_text[i])

# 필터링된 후 완료된 배열의 전체 사이즈 구하기
print(len(alphabets_arr))

첫번째 코드의 문제점

  1. 길다..하지만 긴게 문제가 아니다. 비슷하거나 중복되는 코드들이 if와 elif를 통해 분산되어있다.
  2. 그렇다보면 주석을 아무리달아도 가독성이 떨어진다.

인터넷 자료 참고 후 다시 짠 코드 (이렇게 짧게 할 수 있던 것을...)

input_text = input()
#하나의 문자로 처리해야할 문자들을 배열에 미리 넣어논다.
words = ['c=', 'c-', 'dz=', 'd-', 'lj', 'nj', 's=', 'z=']

#처리해야할 문자들을 for문을 돌며 입력값에 존재유무를 확인한다. 
for letter in words:
    # 특정 알파벳을 * 대체함으로서 하나의 문자로 만든다.
    input_text = input_text.replace(letter, '*')

print(len(input_text))

배운 점

  • Replace. 바꾸고자하는 단어가 있을 시 단어들은 배열에 넣고 for문과 replace를 통해 변경가능하다.
  • 나는 두개이상의 문자를 하나로 취급하기위해서는 그 문자들을 따움표로 묶어줄 생각만 했었다.
    하지만 따움표처리대신 다른 특수기호 (예를 들어 '*')로 replace하면 하나로 취급된다는 것을 배웠다.
  • 또한 배열에 미리 단어들을 저장해 놓는 것은 하드코딩같아 지양하고 있었는데 이것또한 나의 편견임을 알았다. 무엇이든 간에 '적절히' 사용할 줄 알아야되겠다.
profile
Learn From Yesterday, Live Today, Hope for Tomorrow

0개의 댓글