프로그래머스 파이썬 기초 트레이닝 ::문자열 replace 활용 문제 (Str.translate(str.maketrans('abcd', '----', del))

     



     

              


    활용 문제 1번 

    코딩 기초 트레이닝

    Day 19 - (1) 세 개의 구분자 

    Lv.0



    문제 내용 

    임의의 문자열이 주어졌을 때 문자 "a", "b", "c"를 구분자로 사용해 문자열을 나누고자 합니다.

    예를 들어 주어진 문자열이 "baconlettucetomato"라면 나눠진 문자열 목록은 ["onlettu", "etom", "to"] 가 됩니다.

    문자열 myStr이 주어졌을 때 위 예시와 같이 "a", "b", "c"를 사용해 나눠진 문자열을 순서대로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.

    단, 두 구분자 사이에 다른 문자가 없을 경우에는 아무것도 저장하지 않으며, return할 배열이 빈 배열이라면 ["EMPTY"]를 return 합니다.



    myStr                             result

    "baconlettucetomato" ["onlettu", "etom", "to"]

    "abcd"                         ["d"]

    "cabab"                         ["EMPTY"]





    문제 이해 

    a, b, c 세개의 구분자로 문자열을 짤라야 하는데

    Str.split('a').split('b').split('c') 이렇게 split를 연속으로 쓰는건 불가능하다. 

    에러가 발생하기 때문에, a, b, c를 다른 문자로 replace 하는 방법을 사용했다. 

    replace 메서드는 Str.replace('a', ' ').replace('b', ' ').replace('c', ' ') 이렇게 연속으로 사용이 가능하다. 

    replace 가 가능한 이유는 replace의 반환값이 문자열이기 때문이고, split를 연속으로 쓰는게 불가능한 이유는 split의 리턴 값은 리스트로 반환이 되기 때문이다. 




    내가 푼 코드  

    a, b, c의 값을 다른 문자인 - 로 바꿨다.
    def solution(myStr):
        answer = []
        myStr = myStr.replace('a','-')
        myStr = myStr.replace('b', '-')
        myStr = myStr.replace('c', '-')
    
        if set(myStr) == {'-'} :
            return ["EMPTY"]
    
        else : 
            list = myStr.strip('-').split('-')
            for i in list : 
                if i != '' :
                    answer.append(i)
            return answer 


    위 코드의 간결버전 
    def solution(myStr):
        myStr = myStr.replace('a','-')
        myStr = myStr.replace('b', '-')
        myStr = myStr.replace('c', '-')
        return [i for i in myStr.split('-') if i != '' ] or ["EMPTY"]



    위 코드의 초초초초 간결버전 
    def solution(myStr):
        answer = [x for x in myStr.replace('a', ' ').replace('b', ' ').replace('c', ' ').split() if x]
        return answer if answer else ['EMPTY']




    나는 a, b, c 를 다른 문자로 치환했지만 

    b, c를 a 로 바꿔주고 a를 구분자로 둬서 짜르는 방법도 있다. 

    다른 코드  

    def solution(myStr):
        s=myStr.replace('b','a')
        s=s.replace('c','a')
        s=s.split('a')
        answer=[]
        for x in s:
            if x: answer.append(x)
        if not answer:return ["EMPTY"]
        return answer



    -----------------------------------



    활용 문제 2번 

    코딩 기초 트레이닝

    Day 18 - (4) 문자열 바꿔서 찾기

    Lv.0



    문제 내용 

    문자 "A"와 "B"로 이루어진 문자열 myString과 pat가 주어집니다. 

    myString의 "A"를 "B"로, "B"를 "A"로 바꾼 문자열의 연속하는 부분 문자열 중 

    pat이 있으면 1을 아니면 0을 return 하는 solution 함수를 완성하세요.



    myString     pat     result

    "ABBAA"     "AABB"         1

    "ABAB"     "ABAB"         0




    문제 이해 

    myString의 A 를 B로 바꾸고, B를 A로 바꿔도 되지만

    myString의 길이가 pat보다 길기 때문에 pat의 문자열을 replace 하는게 더 시간효율성에서 높다. 





    내가 푼 코드  

    A, B를 if문으로 바꿨다. replace 안씀 
    def solution(myString, pat):
        my = list(myString)
        for i in range(len(my)) :
            if my[i] == 'A' :
                my[i] = 'B'
            else : 
                my[i] = 'A'
        return int(pat in ''.join(my))


    위 코드의 간결버전 
    def solution(myString, pat):
        return int(''.join(['A' if i == 'B' else 'B' for i in pat]) in myString)




    나는 a, b, c 를 다른 문자로 치환했지만 

    b, c를 a 로 바꿔주고 a를 구분자로 둬서 짜르는 방법도 있다. 

    다른 코드  

    A, B를 다른 알파벳으로 바꿈. replace 씀  

    def solution(myString, pat):
        myString = myString.replace("A","C")
        myString = myString.replace("B","D")
        myString = myString.replace("C","B")
        myString = myString.replace("D","A")
    
        return 1 if pat in myString else 0



    위 코드의 간결버전 
    def solution(myString, pat):
        return int(pat in myString.replace('A', 'C').replace('B', 'A').replace('C', 'B'))



    -----------------------------------


    Day-24 (4) l로 만들기

    여러문자를 교체하는 str 메서드, 함수 

    str.translate 메서드 

    replace 메서드를 여러번 수행해야하는걸 한번에 처리해주는 메서드 

    문법 : str객체.translate(table)  


    str.maketrans() 함수 

    translate 메서드가 매개변수로 받는 table을 만드는 함수  

    문법 : str.maketrans(x [, y[, z]]) 

    (함수나 메서드의 매개변수에 [, ]가 있으면 생략가능을 의미함)

        ① x : 변경될 문자들

        ② y : x의 각 문자에 대응하는 대체 문자들 

        ③ z : 삭제될 문자들을 나타내는 문자열 



    a,b,c,d 각각을 - 문자로 대체하고 싶을때 이전에는 이렇게했었는데,

    mystr.replace('a','-').replace('b','-').replace('c','-').replace('d','-')


    테이블을 생성해서 이렇게 한번에 처리가 가능하다. 

    mystring.translate(str.maketrans('abcd', '----')


    maketrans 함수로 테이블을 만들때, 3번째 매개변수(삭제)까지 이용하면 대체, 삭제까지 한번에 처리할 수 있다.

    mystring.translate(str.maketrans('abc', '123', 'd'))

    a는 1로, b는 2로, c는 3으로, d는 삭제를 시킨다.


    maketrans 함수는 문자열을 1:1 매칭하는 것이기 때문에, 1:n 매칭할려면 replace가 더 적합



    -----------------------------------



    활용 문제 4번 

    코딩 기초 트레이닝

    Day 24 - (2) 그림 확대

    Lv.0



    문제 내용 

    직사각형 형태의 그림 파일이 있고, 이 그림 파일은 1 × 1 크기의 정사각형 크기의 픽셀로 이루어져 있습니다. 

    이 그림 파일을 나타낸 문자열 배열 picture과 정수 k가 매개변수로 주어질 때, 

    이 그림 파일을 가로 세로로 k배 늘린 그림 파일을 나타내도록 문자열 배열을 return 하는 solution 함수를 작성해 주세요.






    문제 이해 

    리스트의 한 요소가 문자열로 저장이 되어있어서, 문자열로는 값 변경은 불가능하기 때문에 

    리스트로 바꿔서 값을 늘려야한다. 늘린 후에는 다시 문자열로 리턴해야함. 

    값을 늘리는 방법으로는 난 문자열 첫번째 인덱스를 k배한걸 다시 넣는 방식을 썼는데, 

    replace 메서드를 활용하는 방법이 더 효율적인 것 같다. 





    내가 푼 코드  

    k배한 값을 리스트에 넣기 
    def solution(picture, k):
        answer = []
        for idx, val in enumerate(picture) : 
            val = list(val)
            for v_idx in range(len(val)) : 
                val[v_idx] *= k
            answer += [''.join(val)] * k 
        return answer



    replace로도 가능하다. 

    replace 메서드 코드 

    for문으로 순환하면서 리스트에 추가  
    def solution(picture, k):
        answer = []
        for i in range(len(picture)):
            for _ in range(k):
                answer.append(picture[i].replace('.', '.' * k).replace('x', 'x' * k))
        return answer


     

    for문 대신 단순연산으로 리스트에 추가  

    def solution(picture, k):
        answer = []
        for i in range(len(picture)):
            answer += [picture[i].replace('.', '.'*k).replace('x', 'x'*k)] * k
        return answer







    -----------------------------------




    함수의 마지막 return문을 작성할때, if - else문을 사용하거나 or을 사용해 효율적으로 코드를 작성할 수 있다. 

    return 문 

    return A or B  

    A가 참이면 A를 리턴하고, A가 거짓이면 B로 리턴된다.
    return [i for i in myStr.split('-') if i != '' ] or ["EMPTY"] 

    return stk or [-1] 


    return A if 조건문 else B

    한줄 if 문을 return 문에서 쓰는게 가능하다 
    return answer if answer else ['EMPTY']
    return stk if stk else [-1] 





    댓글

    이 블로그의 인기 게시물

    [KT 에이블스쿨 - IT 트랜드] 국내외 AI 관련 규제

    KT 에이블스쿨 : 6-7차 미니프로젝트 - 제안서 기반 솔류션 기획 및 설계

    KT 에이블스쿨 : 클라우드 서비스 1일차 정리