[백준 파이썬 1065번]함수 활용한 '한수' ★등차수열의 이해★
등차수열을 갖고 있는 수를 구하라는 문제이다.
1. ex) 135 ==> 등차수열을 갖고있는 수
12 ==> 등차수열 갖고있는 수
3 ==> 등차수열 갖고있는 수
보다시피 100미만의 자연수는 등차수열을 갖고있다. 따라서 고려할때 3자리수 이상의 자연수만 고려 하면 좋을거 같다.
import sys
while True:
N = int(sys.stdin.readline())
if N<0 or N>200000:
print("N값은 1000보다 작거나 같은 자연수입니다.")
else:
break
def solution(n):
total = 0
for i in range(N):
d = [] #내가 새로 만들 등차수열 출력할 리스트
b = list(str(i+1)) #i+1을 하는 이유?===> range(N)의 경우 0부터 출력되기때문
#b = ['1'] ['1' , '5'] ''''' ==> 이런식으로 하나 하나씩 b객체에 저장된다.
c = list(map(int,b)) #c 객체에 b객체에 있는 값을 int형 처리해준다.
for j in range(len(c)): #c 객체의 길이 c의 형태는 c = [1] [4 , 5] [1 5 6] 이런식으로 되어있다.
if len(c)<=2: #두자리수이하의 자연수는 모두 등차수열을 갖는 '한수' 이다.
total+=1 #따라서 갯수를 모두 더해준다.
break#break을 통해 더 볼것도 없이 그냥 반복문 나온다.
else:
su, n ,n2= 0, 0 , 0
n = c[1] - c[0]
n2 = c[1] - n
su = n*j + n2 #등차수열의 식이다.
d.append(int(su)) #내가 새로 만든 등차수열 리스트 d 에 추가한다.
#d = [1,0,-1]
if c == d: #만약에 c , 즉 1부터 N까지 주르륵 만든 리스트값이 d와 동일하다면
total+=1 #total로 더해준다.
return total
print(solution(N))
★중요 포인트★
1. 등차수열을 구하는 새로운 나의 리스트와 1000까지 출력한 리스트 c와 같으면 total값을 증가시켜 갯수를 더한다.
2. c = list(map(int,b)) ==> b리스트의 값들을 정수로 바꾼다!
3. 알고리즘 순서 :
1) N까지의 리스트를 b에 1을 더한값으로 string 형태로 생성시킨다.
2) 이 b리스트의 요소들의 값을 map함수를 활용하여 int형으로 변환시킨다.
3) c리스트의 요소들의 길이만큼 반복문을 실행시킨다.
4) c리스트의 요소들의 길이가 2이하라면 total값을 1씩 증가시킨다.
5)c리스트의 요소들의 길이가 3이상이라면 c리스트의
● 인덱스 1번(c[1])과 0번(c[0]) 을 뺀값 = n
● 인덱스 1번(c[1]) 과 n을 뺀값 = n2
● 등차수열 = n * j(c리스트의 인덱스값을 range값으로 처리) + n2 가 된다.
ex> 2 7 12 17 22 ==> 7-2 = n , 7-n = n2 ==> n=5 n2=2 ==> 5*j + 2(j는 인덱스 0부터) 가된다는 것을 알 수 있다.
6) 이를 나만의 임의의 d리스트에 이 임의의 등차수열의 값들을 저장하게 된다.
ex>
1.
b =['1','4','6'] c =[1,4,6]
n = 4-1 = 3
n2 = 4- 3 = 1
su = 3*j +1
.
.
.
d = [1,4,7] <==c리스트와 다르다!!!
2.
b =['1','4','7'] c =[1,4,7]
n = 4-1 = 3
n2 = 4- 3 = 1
su = 3*j +1
.
.
.
d = [1,4,7] <==c리스트와 같다!!!
total+=1
7) 이 c리스트가 d리스트안에 있는 리스트와 동일하다면 total값을 1씩 더해준다.
'Python(백준) > 함수' 카테고리의 다른 글
[Python][백준] 1065번: 한수 (0) | 2022.09.14 |
---|---|
[Python] 백준 15596번 정수 N개의합 (0) | 2022.09.14 |