문제 출처 : 프로그래머스

문제는 여기에


문제

  • 숫자로 이루어진 문자열 t와 p가 주어진다. (문자열 길이 t > p)
  • t의 문자열을 p의 길이만큼 부분 문자열으로 나눈다.
  • 나눈 부분 문자열이 나타내는 수가 p보다 작거나 같은 것이 나오는 횟수를 return 하는 함수 solution을 완성해라

 

제한사항

  • 1 <= p의 길이 <= 18
  • p의 길이 <= t의 길이 <= 10,000
  • t와 p는 숫자로만 이루어진 문자열이며, 0으로 시작하지 않습니다.

입출력 예

 

접근

  1. p의 길이만큼 부분 문자열을 만들어야하니 슬라이싱을 이용해야지 (인덱스의 차이는 p의 길이만큼)
  2. for 문을 돌면서 시작하는 인덱스를 1씩 증가시켜야겠다.
  3. 만들어진 부분 문자열을 곧바로 정수형의 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 문을 한 번에 사용하는 법을 알아야한다.

 

 

깨알지식

  1. 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분 정도만 공부해도 한 줄 표현이 더 좋을 것 같다는

생각이 든다. 적응하고 자주 쓸 수 있게 기회가 있다면 한 줄 쓰기로 도전 해야겠다.

 

 

한 줄 쓰기 출처 : https://leedakyeong.tistory.com/entry/python-for%EB%AC%B8-if%EB%AC%B8-%ED%95%9C-%EC%A4%84%EB%A1%9C-%EC%BD%94%EB%94%A9%ED%95%98%EA%B8%B0