[99클럽 코테스터디 2기][Python/비기너] 31번째 문제: Decode the Message

최민지·2024년 6월 19일
0
post-thumbnail

오늘의 주제는 문자열....
오랜만에 오랫동안 헤맨 문제였다..
그래서 아마 TIL이 굉장히 길어질 것으로 예상된다..!

[Decode the Message]

문제

입력과 출력

코드

lass Solution:
    def decodeMessage(self, key: str, message: str) -> str:
        # a=chr(97)
        # 알파벳 배열 생성
        alph = [chr(i) for i in range(97, 123)]

        # 띄어쓰기 없는 배열(알파벳과 위치 비교용)
        key_notsp=[]
        for st in key:
            if st!=" " and st not in key_notsp:
                key_notsp.append(st)

        result=[]
        num=0
        
        for st in message:
            if st==" ":
                result.append(st)
            else:
                num=key_notsp.index(st)
                #길이가 알파벳 개수보다 길때
                if num>25:
                    num-=25
                result.append(alph[num])
        
        return ''.join(result)

알고리즘

내가 이해한 바로는, 주어진 key의 문자 하나하나를 알파벳 순서에 맞게 매칭하고 이를 통해 message 문자열을 이 알파벳으로 암호화해야 하는 문제였다.
그래서 나는 인덱스 비교를 위해 (1) 알파벳으로 구성된 배열을 먼저 생성했다.
그 다음 알파벳과 위치를 비교하기 위해 (2) 띄어쓰기와 중복을 제거한 배열을 생성했다.
그리고 message의 문자열이 (3) 띄어쓰기일때는 그대로 result에 담아주고, (4) 문자일때는 key_notsp 배열에서 이 문자의 인덱스를 반환한 후 이 (5) 인덱스 위치에 있는 alph 배열의 요소를 result에 담아준다.
(6) result 배열을 문자열로 바꿔 반환해주면 끝.

회고

나의 길었던 여정을 모두 담았으니.... 필요없는 분들은 스킵하길 바란다.. 최대한 가독성있게 작성해보겠다..


처음에는 이런식으로 코드를 구성했었다. 알고리즘은 얼추 맞았다고 생각했는데
첫 오류는 set함수로 중복을 제거하면 set 타입으로 반환되는 걸 몰라서 난 오류였다. 이부분은 list(set(문자열))로 수정해주었고


그렇지만 다른 문제가 발생했다.
아예 문자열을 읽어오지 못하는 것..
사진의 코드 상태가 왜이러냐면 문자열을 읽어오질 못하니까 내가 생성한 배열들이 잘 받고 있는지 하나씩 반환해보기 위해 다 지운 상태였다


일단 알파벳을 담은 문자열은 이런식이였는데
이땐 몰랐지만 이런식으로 설정하면 안될거 같아 나중에 바꾼다..!


중복제거한 배열이 문제였다.
set함수로 중복을 제거해서 문자열이 순서가 유지되지 않은 채로 중복이 제거되는 문제였다.

다른 중복제거 방법을 찾았지만 띄어쓰기도 제거되는게 문제였다..
사실 이때의 내가 큰 착각을 하고있었던게 띄어쓰기 위치는 message 배열에서 고려를 하면 되는데 무조건 key배열에서 띄어쓰기를 살려야 한다고 생각했던 점이다.. 허허 이 시행착오는 곧 나올 예정


두번에 걸쳐 띄어쓰기도 제거하고, 중복도 제거하는 코드를 완성했었다.. 사실 필요없는 노동이였음 그래도 이런 과정을 통해 코드를 이해해서 결국 풀 수 있었으니 뭐.. 의미없진 않았다!

여튼 한 30분만에 중복제거한 배열을 받는 데에 성공했다


깔끔한 사진이 보이시나요?
결국 뭔가 잘못됐다는 걸 깨닫고 알파벳 배열부터 다시 생성하기 시작한 나..
여기까지 깨닫는데 50분이 걸렸다

여튼 알파벳 배열은 alph = [chr(i) for i in range(97, 123)] 로 생성해주었다.


순조롭게 코드를 마치고 드디어..?!하는 마음으로 실행했는데 이런 오류가 떴다..
이 부분을 지우고 result를 반환해봤는데 문제가 없었기에
num이 문제라고 생각했다

그러다가 떠오른 생각... 알파벳 개수보다 문자열이 길면? 당연히 인덱스를 넘어서서 오류가 나겠구나..!


그래서 알파벳 개수가 26개니까 num이 26보다 크면 26을 빼주면 되겠지~ 했는데
뭔가 이상하게 알파벳과 매칭이 되어있었다 ㅜㅜㅜ

일단, 이때는 문자열을 띄어쓰기를 유지한채로 알파벳 배열과 매칭중이였다.. (왜그랬는지 모르겠다) 드디어 이걸 깨닫고

띄어쓰기 없는 배열을 또 생성해줘야지~ 하면서 전체코드를 손보던 중.. 어라 이러면 처음 temp 배열은 필요없고 띄어쓰기는 message에서 비교하면 되잖아! 하는 생각..ㅎ 그렇다 아까 말한 부분이 여기다

이부분을 수정하고 내가 또 잘못생각했던 부분이, num은 인덱스를 반환하는 거니까 알파벳이 26개면 -> 0~25... 그러니까 25보다 클때로 수정해야 했다..!
이 부분을 수정하고


드디어...!!!!!
맞는 배열 출력에 성공했다 ㅜㅜㅜㅜ
출력값은 문자열 형태니까 이 부분만 수정했다..


짜잔..~
runtime이 긴 것,, 안다
그치만 다른 분 코드를 이해하기엔 파이썬 초보로써 힘들었고...
결국 끝까지 내 힘으로 비록 효율은 좋지 못하지만 ,, 알고리즘을 완성했다는 것이 뿌듯했다..

아마 파이썬 함수들을 많이 알고있지 못해서 다른 분들 코드를 참고하기가 힘들었던 것 같다..

그래도 시간 여유를 가지고 끝까지 매달려본 문제였다..!! 뿌듯!!!!
1시간 13분 빡집중해서 문제를 풀어냈다.. 수고했다 나자신

profile
공부..일기....

0개의 댓글