문제 출처 : 프로그래머스
문제는 여기에
문제
- 숫자로 이루어진 문자열 t와 p가 주어진다. (문자열 길이 t > p)
- t의 문자열을 p의 길이만큼 부분 문자열으로 나눈다.
- 나눈 부분 문자열이 나타내는 수가 p보다 작거나 같은 것이 나오는 횟수를 return 하는 함수 solution을 완성해라
제한사항
- 1 <= p의 길이 <= 18
- p의 길이 <= t의 길이 <= 10,000
- t와 p는 숫자로만 이루어진 문자열이며, 0으로 시작하지 않습니다.
입출력 예
접근
- p의 길이만큼 부분 문자열을 만들어야하니 슬라이싱을 이용해야지 (인덱스의 차이는 p의 길이만큼)
- for 문을 돌면서 시작하는 인덱스를 1씩 증가시켜야겠다.
- 만들어진 부분 문자열을 곧바로 정수형의 p와 비교해서 조건에 맞으면 카운트를 해야겠다.
풀이
def solution(t, p):
answer = 0
a = int(t)
b = int(p)
c = a - b
for i in range(c+1): # range(c)만큼 반복하면 t 문자열의 마지막 문자까지 도달 X
if int(t[i:i+b]) <= int(p):
answer += 1
return answer
고찰
c를 정의하지 않고 바로 사용해도 될 것 같다.
한 줄 짜리 코드를 발견해서 공부할 겸 아래에다가 적겠다.
다른 풀이
def solution(t, p):
return len([t[i: i+len(p)] for i in range(len(t)-len(p)+1) if int(t[i: i+len(p)]) <= int(p)])
위 코드를 이해하기 위해서는 for 문과 if 문을 한 번에 사용하는 법을 알아야한다.
깨알지식
- if condition에 해당하는 값만 출력하기
for i in range(10,20):
if i == 12:
print(i)
-> 12
위의 코드를 한 번에 적어보면
[i for i in range(10,20) if i == 12]
-> [12]
로 표현이 된다.
출력을 보면 알 수 있듯이! 첫 번째 코드는 정수형을 출력하고, 두 번째 코드는 리스트를 출력한다.
2. for문에 해당하는 각각의 원소가 if condition에 해당하는지, 아닌지
for i in range(10,20):
if i == 12:
print(i)
else:
print("No")
-> No No 12 No No No No No No No (줄바꿈 생략)
[i if i == 12 else "No" for i in range(10,20)]
-> ['No', 'No', 12, 'No', 'No', 'No', 'No', 'No', 'No', 'No']
제대로 공부 안 하고 봤을 때는 왜 이렇게 어렵게 쓰나 싶었는데, 10분 정도만 공부해도 한 줄 표현이 더 좋을 것 같다는
생각이 든다. 적응하고 자주 쓸 수 있게 기회가 있다면 한 줄 쓰기로 도전 해야겠다.
'🧑💻 Coding Test > 프로그래머스' 카테고리의 다른 글
[프로그래머스 Level 1] 추억점수 (Python) (0) | 2023.09.07 |
---|---|
[프로그래머스 Level 1] 과일 장수 (Python) (0) | 2023.08.31 |
[프로그래머스 Level1] 삼총사 (Python) (0) | 2023.08.30 |
[프로그래머스 Level 1] 달리기 경주 (Python) (0) | 2023.08.24 |
[프로그래머스 Level 1] 나머지가 1이 되는 수 찾기 (Python) (0) | 2023.08.22 |