Practice/알고리즘

파이썬 알고리즘 : K번째 약수 구하기.

밍미a 2022. 11. 10. 20:48
728x90

알고 넘어가야 할 파이썬 이론:

map() 함수:

map(f, iterable)은 함수(f)와 반복 가능한(iterable) 자료형을 입력으로 받는다. map은 입력받은 자료형의 각 요소를 함수 f가 수행한 결과를 묶어서 돌려주는 함수이다.

 

list(map(함수, 인자값)) : 함수에 인자값을 넣어 나온 결과값을 묶어 리스트로 만들어준다.

def two_times(x):
    return x * 2

a = list(map(two_times, [1, 2, 3, 4]))

print(a)

Output:

 

https://wikidocs.net/32#map

 

range() 함수:

range(start,end) : start와 end 사이의 연속적인 숫자들을 리턴한다. 리턴되는 연속적인 숫자들을 활용하여 리스트를 만들거나 반복문에서 사용될 수 있다.

range(start, end, step)
  • start : start로 시작되는 숫자부터 리턴
  • end : end가 포함되지 않는 숫자까지 리턴
  • step : 연속적인 숫자들 중에, step의 간격에 해당되는 숫자들만 리턴

1. range(5): 0~4 숫자 리스트

result = list(range(5))
print(result)

Output:

 

 

2. range(1, 5): 1에서 시작하고 5를 포함하지 않는 리스트가 리턴됨

result = list(range(1, 5))
print(result)

 

Output:

3. range(1, 10, 2): 1에서 시작하고 10을 포함하지 않는 숫자들 중에, 2의 간격에 해당하는 숫자가 리턴됨(등가수열)

result = list(range(1, 10, 2))
print(result)

Output:

 

4. for 문에서 사용되는 range(start,end) : sratr에서 end 이전 까지 반복함.

for value in range(1, 5):
    print(value)

 >> 1에서 4까지 반복함. 

Output:

https://codechacha.com/ko/python-range/

for-else 문:

for-else문은 for 문이 break문 등으로 중간에 빠져나오지 않고 끝까지 실행 됐을 경우 else문이 실행되는 것이다.

for i in range(5):
    print(i, end=' ')
else:
    print("for문이 끝까지 실행됬습니다!")

for i in range(5):
    if i == 2:
        break
    print(i, end=' ')
else:
    print("for문이 끝까지 실행됬습니다!")

Output:

https://cagongman.tistory.com/30

 

오늘 배운 내용

더보기

K 번째 약수

 

어떤 자연수 p와 q가 있을 때, 만일 p를 q로 나누었을 때 나머지가 0이면 q는 p의 약수이다.

6을 예로 들면

6 ÷ 1 = 6 … 0
6 ÷ 2 = 3 … 0
6 ÷ 3 = 2 … 0
6 ÷ 4 = 1 … 2
6 ÷ 5 = 1 … 1
6 ÷ 6 = 1 … 0

 

그래서 6의 약수는 1,2,3,6 총 네 개이다.

두 개의 자연수 N과 K가 주어졌을 때, N의 약수들 중 K번째로 작은 수를 출력하는 프로그램을 작성하시오

 

■ 입력설명

첫째 줄에 N과 K가 빈칸을 사이에 두고 주어진다. N은 1 이상 10,000 이하이다. K는 1이상 N이하이다.

 

■출력설명

첫째 줄에 N의 약수들 중 K번째로 작은 수를 출력한다. 만일 N의 약수의 개수가 K개보다 적어서 K번째 약수가 존재하지 않을 경우에는 -1을 출력하시오.

 

■ 입력예제 1

6 3 

■ 출력예제 1

3

 

 

문제 풀이 코드:

n, k = map(int,input().split())
cnt = 0
for i in range(1,n+1):
    if n%i == 0:
        cnt +=1
    if cnt == k:
        print(i)
        break
else:
    print(-1)

 

코드 분석 :

n, k = map(int,input().split())
# input()으로 들어온 값을 split()으로 나눠서 int 로 변환 해준 뒤 맵으로 묶어준 것을 각각 n과 k에 넣는다.
cnt = 0
#갯수를 세야하니까 cnt 변수를 하나 지정해준다.
for i in range(1,n+1):
# 1부터 시작해서 n만큼의 길이만큼 반복문을 돌리는데
    if n%i == 0:
        #만약 n나누기 i 가 0과 같다면 cnt에 하나씩 더하며 넣어준다.
        cnt +=1
    if cnt == k:
        #만약 cnt 값이 k와 같다면 i를 프린트 하고 함수를 빠져나온다.
        print(i)
        break
else:
    #만약 걸리는 k 값이 없다면 -1을 프린트해준다.
    print(-1)

 


더 배울 내용

 

파이썬의 내장함수 활용법과 for문의 개념이 아직 확실히 체득되지 않아서 헷갈린다. 조금 더 연습해야 할 필요성이 있다.


느낌점

아무래도 알고리즘 공부는 따로 준비하는것이 나을 것 같다. 하루에 두문제씩 꾸준히 공부하고 분석하는 습관을 들여야겠다. 스파르타 코딩클럽 강의도 듣지만 인프런 강의도 추가로 결제해서 보충공부를 해야겠다..

하루라는 시간이 너무 부족하다. 시간은 부족한데 점점 가면 갈수록 몰입도가 떨어지는 느낌이다. 몰입하는 연습을 하기위해 45분몰입 10분휴식 패턴을 가지고 공부를 하려고 한다. 그 전에는 쉬는시간 없이 내가 몰입할 수 있을만큼 최대한 몰입해서 했으나 앉아있는 시간만 길어지고 집중이 잘 안되서 효율이 떨어지는 것 같은 느낌을 받았다. 오늘부터 45분 집중 10분휴식으로 공부했는데 전보다는 몰입을 잘 하게되는 것 같다.