문제 출처 : 프로그래머스

문제는 여기에


문제

  • 숫자로 이루어진 문자열 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

문제 출처 : 프로그래머스

문제는 여기에


문제

  • 자연수 n이 매개변수로 주어진다.
  • n을 x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return하는 solution 함수를 완성해라

 

입출력 예

 

접근

1. for문을 돌리면서 나머지가 1인 것들을 찾아야겠다.

 

나의 코드

def solution(n):
    result = []
    for i in range(2,n):
        if n % i == 1:
            result.append(i)
    answer = min(result)
    return answer

 

고찰

나는 별 생각없이 n을 x로 나눈 나머지가 1인 것들을 모두 찾아 리스트에 추가하였고

그 리스트들 중에서 가장 작은 수를 return 하는 방법을 했는데

생각해보니 n-1까지 for문을 돌면서 나머지가 1인 것들을 모두 찾는 것은 비효율적이라는 것이다.

나머지가 1이 되는 것을 찾으면 반복을 빠져나오자

수정한 코드

def solution(n):
    for i in range(2,n):
        if n % i == 1:
            break
    answer = i
    return answer