ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] 프로그래머스 : 크기가 작은 부분문자열
    코딩테스트/프로그래머스 2024. 7. 18. 15:01

    [문제 풀기 전 생각한 부분]

    # for 문으로 p의 길이만큼 인덱싱을 이용해서 자르고, 자른 값들을 바로 비교할 수 있나? 없으면
    # 리스트에 정수형으로 저장한 뒤 리스트의 길이만큼 반복해서 p와 비교한다. (p도 정수형으로 변환할 것.)

    [my_code]

    1. 의도 : i 부터 int(p) 만큼 슬라이싱 

    t = "3141592"
    p = "271"
    
    for i in range(len(t)):
        print(t[i:int(p)])
        
    # 출력결과
    3141592
    141592
    41592
    1592
    592
    92
    2

     

    [문제점]

    1. 출력 결과를 보면 int(p) 는 고정된 값이다... 글을 쓰면서도 참... ㅎㅎ (넘어갈게요)

    1-1. 따라서 i 부터 : 271 까지 범위를 준 거다. 슬라이싱은 인덱스 범위를 초과해도 알아서 잘 출력해준다 ^^

    t = "3141592"
    p = "271
    
    for i in range(len(t)):
        print(t[i:(len(p)+i)])
        
    # 출력결과
    314
    141
    415
    159
    592
    92
    2

    - 나름 의도한 대로 잘 출력이 되었다. 여기서 if 문을 통해 제약을 걸어주면 90% 는 끝났다고 생각한다. 

    [문제점 해결]

    t = "3141592"
    p = "271"
    
    t_list = []
    
    for i in range(len(t)):
        nums = t[i:(len(p)+i)]
        
        if len(nums) == 3:
            t_list.append(int(nums))
    
    print(t_list)
    
    # 출력결과
    [314, 141, 415, 159, 592]


    [마무리 하는 과정에서의 실수 1]

    t = "3141592"
    p = "271"
    
    int_p = int(p)
    
    t_list = []
    
    for i in range(len(t)):
        nums = t[i:(len(p)+i)]
        
        if len(nums) == 3:
            t_list.append(int(nums))
    
    result = 0
    
    for i in t_list:
        if int_p > t_list:
            result += 1
    
    print(result)

    int_p 와 t_list 안에 있는 값들을 하나씩 비교해야되는 데, 그렇지 못해 타입에러가 났다.

    [마무리 하는 과정에서의 실수 2]

    t = "3141592"
    p = "271"
    
    int_p = int(p)
    
    t_list = []
    
    for i in range(len(t)):
        nums = t[i:(len(p)+i)]
        
        if len(nums) == 3:
            t_list.append(int(nums))
    
    result = 0
    
    for i in t_list:
        if int_p > i:
            result += 1
    
    print(result)

    - 위 테스트케이스를 보면 테스트 1를 제외한 테스트2,3 은 실패한 것을 볼 수 있다. 왜 그럴까?

    - 아래 코드에서 len(nums) == 3 으로 고정되어 있기 때문이다. 

        if len(nums) == 3:
            t_list.append(int(nums))

    [마무리 하는 과정에서의 실수 3]

    - 따라서 위 코드를 아래 코드와 같이 변경해 주었다. 

        if len(nums) == len(p):
            t_list.append(int(nums))

    - 여전히 테스트 2 는 통과하지 못한다. 왜 그럴까? 

    - 우선, 로직에 문제가 있나 print문을 통해 확인해보자.

    t = "500220839878"
    p = "7"
    int_p = int(p)
    
    t_list = []
    
    for i in range(len(t)):
        nums = t[i:(len(p)+i)]
        # print("nums : ",nums)
        
        if len(nums) == len(p):
            t_list.append(int(nums))
            print("t_list : ",t_list)
    
    result = 0
    
    for i in t_list:
        if int_p > i:
            result += 1
    
    print(result)
    
    # 출력결과
    t_list :  [5]
    t_list :  [5, 0]
    t_list :  [5, 0, 0]
    t_list :  [5, 0, 0, 2]
    t_list :  [5, 0, 0, 2, 2]
    t_list :  [5, 0, 0, 2, 2, 0]
    t_list :  [5, 0, 0, 2, 2, 0, 8]
    t_list :  [5, 0, 0, 2, 2, 0, 8, 3]
    t_list :  [5, 0, 0, 2, 2, 0, 8, 3, 9]
    t_list :  [5, 0, 0, 2, 2, 0, 8, 3, 9, 8]
    t_list :  [5, 0, 0, 2, 2, 0, 8, 3, 9, 8, 7]
    t_list :  [5, 0, 0, 2, 2, 0, 8, 3, 9, 8, 7, 8]

    - t_list에 의도한 대로 잘 들어가 있다. 

    - 그러면 두 번째 for문에서 오류가 있을 확률이 크다. 

    - 어떤 오류인지 아시겠나요? 모르면 문제로 가야지요...

    - 요구사항에서 작거나 같은 것이 나오는 횟수를 return 하라고 되어 있다. 따라서 등호를 붙여주자

     

    [최종 프로그래머스 제출 코드]

    def solution(t, p):
        int_p = int(p)
    
        t_list = []
    
        for i in range(len(t)):
            nums = t[i:(len(p)+i)]
    
            if len(nums) == len(p):
                t_list.append(int(nums))
    
        result = 0
    
        for i in t_list:
            if int_p >= i:
                result += 1
    
        return (result)

     

     

    [실수를 통해 느낀 점]

    - 항상 요구사항을 잘 읽겠다고 다짐해도 잘 안되고 실수는 나온다. 

    - 그럼 어떻게 해야될까?

    - 실수를 빠르게 인정하고 코드를 처음부터 짤 생각으로 문제에 임하자. 

Designed by Tistory.