복기/코딩테스트

연속하는 자연수의 곱? (Python)

ziasu 2021. 10. 18. 12:09
반응형

1. 문제 

- 연속하는 자연수 두 개 이상 곱해서 만들 수 있는 값을 크기 순으로 나열한 수열 arr가 있다.

ex) 2, 6, 12, 20, 24, 30, 42...

- 자연수 n이 매개변수로 주어질 때 arr [n]을 return 해주는 함수 만들기

- n은 1~10^6

 

2. 풀이

- 일단 arr의 요소들을 나열해보며 규칙을 발견해보자

(0) 1*2 = 2

(1) 2*3 = 6

(2) 3*4 = 12

(3) 4*5 = 20

(4) 2*3*4 = 24

(5) 5*6 = 30

(6) 6*7 = 42

(7) 7*8 = 56

(8) 3*4*5 = 60

(9) 8*9 = 72

(10) 9*10 = 90

(11) 10*11 = 110

(12) 4*5*6 or 2*3*4*5 = 120

(13) 11*12 = 132

(14) 12*13 = 156

(15) 13*14 = 182

(16) 14*15  or 5*6*7 = 210

(17) 15*16 = 240

(18) 16*17 = 272

(19) 17*18 = 306

(20) 6*7*8 = 336

(21) 18*19 = 342

(22) 19*20 = 380

(23) 20*21 = 420

(24) 21*22 = 462

(25) 7*8*9 = 504

(25) 22*23 = 506

#arr의 index가 4의 배수일 때마다 연속하는 세 개의 정수가 곱해진 값이 들어가는 줄 알았으나 아닌 것을 확인

 

- 입력 n을 받고 리스트 arr에 다양한 조건들을 비교해가며 하나씩 원소를 넣어준 후, arr의 마지막 요소를  return 하는 방식?

ex) n=7라면? (위에 있는 표는 arr, 아래에 있는 표는 dp)

1)

2
    2              

2)

2 6
    2 6            

3)

2 6 12
    2 6 20          

4)

2 6 12 20
    2 6 12 20        

5)

2 6 12 20 24
    2 (6) 12,24 20        

6)

2 6 12 20 24 30
    2   12,24 20 30      

7)

2 6 12 20 24 30 42
    2   12,24 20 30 42    

 

dp의 인덱스 i에는 i로 끝나는 값들이 저장되어 있다.

 

위의 그림과 같이 새로운 요소를 arr에 넣을 때는 다음의 조건들을 고려해야 한다.

#n*(n-1) vs (n보다 작은 dp 인덱스를 훑으면 그 요소에 n을 곱한 값) -> 더 작은 값을 arr에 넣어준다.

#dp에 있는 요소를 활용하여 arr를 채운 경우에는 dp를 규칙에 맞게 갱신해 줌

반응형