-
[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)
[실수를 통해 느낀 점]
- 항상 요구사항을 잘 읽겠다고 다짐해도 잘 안되고 실수는 나온다.
- 그럼 어떻게 해야될까?
- 실수를 빠르게 인정하고 코드를 처음부터 짤 생각으로 문제에 임하자.
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[Python] 프로그래머스 : 3진법 뒤집기 (0) 2024.07.18 [Python] 프로그래머스 : 같은 숫자는 싫어 (0) 2024.07.17 [Python] 프로그래머스 : 최대공약수와 최소공배수 (0) 2024.07.17 [Python] 프로그래머스 : 핸드폰 번호 가리기 (0) 2024.07.16 [Python] 프로그래머스 : 제일 작은 수 제거하기 (0) 2024.07.16