내일배움캠프 TIL 23/09/18

김민재·2023년 9월 19일
0


주특기 주차가 시작되면서 팀이 새로이 변경되고 장고심화 강의가 지급되었다. 이번엔 코드카타를 진행하면서 겪은 어려움에 대해서 적어보려고 한다. 17번 핸드폰 번호가리기 문제는 굉장히 많이 고민을 했다. 번호 뒷자리 4개만 그대로 나오게 해주고 나머지는 *표시로 바꿔야 하는데, 번호 갯수가 달라질 수도 있어서 뒷자리 번호의 위치도 달라질 수 있기에 골치가 아팠다. 처음엔 기존 배열에서 뒷자리만 빼낼 수 있는 슬라이싱도 기억이 안나서 배열 자체를 뒤집으면 뒷자리 4개는 앞자리4개만 될 것이기에 뒤집어서 진행하는 방식으로 밖에 생각이 안났다.

def solution(phone_number):
    answer = ''
    rev = reversed(phone_number)
    for i, x in enumerate(list(rev)):
        if i == 0 or i == 1 or i == 2 or i == 3:
            # 개인 프로젝트때도 겪었던 if문에서의 or 사용 주의
            answer += x
        else:
            x = '*'
            answer += x
    return reversed(answer)
    # reversed(answer)은 <reversed object at 0x000001FF93CBAD60> 형태로 표현

그래서 처음 겪은 시행착오가 위의 코드. 그리고 처음엔 문자열 배열을 뒤집어서 for문을 돌리는 것 만으로는 번호 숫자 하나하나 따로 분리해주지 못해서 list형식으로 바꾸어주고 for문을 돌리는 방식을 취했다. 그리고 if문에서 개인프로젝트에서 했던 오류를 그대로 범했는데 if i ==0 or 1 or 2 이러한 방식은 눈으로 보기에는 이해할 수 있을지 몰라도 컴퓨터는 i==0 이거나 1이거나 2 이런식으로 받아들이기 때문에 위의 코드처럼 바꿔줄 필요가 있다. 똑같은 실수를 범했음에도 빨리 알아차리지 못했던 점이 아쉽다. 그리고 if문을 만족하는 문자(for문의 x의 타입을 확인해서 str인 것을 미리 확인했다.)를 조건에 맞게 변화시켜줘서 answer라는 빈 문자열에 넣어줬다. 여기까지 진행했다면 answer의 형태는 '****4321010'이런 형태일 것이다. 그래서 다시 이 값을 reversed함수에 넣어서 return해줬는데 여기서 <reversed object at 0x000001FF93CBAD60>라는 형태로 배출되어서 이를 바꾸지 못한다면 틀린 문제 풀이가 될 수 밖에 없다. 저것도 사실 at 이후의 메모리에 reversed object가 저장된 것이라 알고 있는데, dict 형식으로 뽑아내는 개인프로젝트 해설 강의에서 repr 함수를 사용했던 것이 기억이 났는데 위와 같은 함수에서 어떻게 적용하는지 알지 못했기에 결국 다른 해결 방법을 찾아보게 되었다.


그래서 검색을 통해 '문자열 뽑아내기', '문자열 뒷순서부터' 등 검색해본 결과로 슬라이싱을 활용할 수 있겠다고 생각했다. 그래서 phone_number[-4:-1], [-4:0] 등 많은 형태로 시도해봤다. [-4:-1]와 같은 경우에는 거꾸로 시작해서 3번째까지 밖에 슬라이싱 해주고 [-4:0]의 형태는 모든 배열이 포함되는 상황이 발생했다. 근데 잠깐 망각했던 것은 슬라이싱 해주는 4개의 값을 로 변환하는게 아니라 앞에 올 수 있는 미지의 문자배열(갯수를 알 수 없다)을 로 바꿔줘야 하는 것이다. 그래서 혼자 고민하다 어떻게 count방식을 사용했는데 '01012341234' 형태의 phone_number가 phone_number.count('')에서 12라는 값을 어떻게 갖는 지는 잘 모르겠지만, 어떠한 정수값을 뽑아내 줬으니 이제 뒷자리 4개는 고정에 +1을 해줘서 -5를 빼주면 된다는 결론까지 다다랐다.

def solution(phone_number):
    a = '*'*(phone_number.count('')-5)
    b = phone_number[-4:]
    return a+b

인위적으로 만들어준 *에 정수를 곱해준 변수 a와 b를 합쳐 answer 문자열을 완성시켰다. 이렇게 진행하니 답안 제출에는 성공했다. 그런데 다른 사람들의 풀이에서는 위와 비슷한 코드 진행인데 count 함수가 아니라 len을 사용했다. 나도 조금 일찍 len 함수가 기억났다면 오히려 더 복잡하게 생각하지 않아도 되지 않았을까 하는 생각이 들었다.

0개의 댓글