멀리 뛰기
코딩테스트 연습 - 멀리 뛰기
효진이는 멀리 뛰기를 연습하고 있습니다. 효진이는 한번에 1칸, 또는 2칸을 뛸 수 있습니다. 칸이 총 4개 있을 때, 효진이는 (1칸, 1칸, 1칸, 1칸) (1칸, 2칸, 1칸) (1칸, 1칸, 2칸) (2칸, 1칸, 1칸) (2칸, 2
programmers.co.kr
- 내 풀이
- 순열을 이용해서 가능한 경우의 수 합산
- nPr=itertools.permuatations(반복 가능한 객체(길이 n) , r)
- nCr=itertools.combinations(n,r)
- fail) 런타임에러
- 순열을 이용해서 가능한 경우의 수 합산
import itertools #순열조합
def solution(n):
m=n
k=0
answer = 0
arr=[1]*n
while len(arr)>=n//2:
nPr = list(set(itertools.permutations(arr, m)))
print(nPr)
answer+=len(nPr)
m-=1
if 1 not in arr:
break
arr.remove(1)
for i in range(len(arr)):
if arr[i]==1:
arr[i]+=1
if sum(arr)<n:
continue
else:
break
else:
break
return answer%1234567
- 내 풀이 2
- 순열 함수 이용X → 조합의 연산방법만 이용
- 시간 감소 , 런타임 에러는 나지 X
- 2의 개수가 0또는 r개 이면 nCr= 1
- 나머지는 nCr 계산방법 대로 num값 계산
- for문에서 num을 / 대신 //로 나누었더니 통과(몫만 계산)
- 1을 없애고 2를 하나씩 늘려가는 방식
- 순열 함수 이용X → 조합의 연산방법만 이용
def solution(n):
answer = 0
arr=[1]*n
num=1
while len(arr)>=n//2:
c=arr.count(2)
if c==0 or c==len(arr):
answer+=1
else:
for i in range(1,c+1):
num*=len(arr)+1-i
num//=i
answer+=num
num=1
if 1 not in arr:
break
arr.remove(1)
for i in range(len(arr)):
if arr[i]==1:
arr[i]+=1
if sum(arr)<n:
continue
elif sum(arr)==n:
break
else:
break
return answer%1234567
print(solution(4))
print(solution(3))
print(solution(10))
#결과
5
3
89
- 다른 사람 풀이
- 다이나믹 프로그래밍(DP) 풀이 방법
- 계단을 1,2칸만 올라갈 수 있으므로 3칸을 오를 때는 1,2칸을 오르는 경우의 수를 합해주면 되고,
- 점화식으로 나타내면 f(n)=f(n-1)+f(n-2) 피보나치 수열과 같다
def solution(n):
answer = 0
dp = [0]*(n+1)
dp[0], dp[1] = 1, 1
for i in range(2, n+1):
dp[i] = dp[i-1] + dp[i-2]
answer = dp[n] % 1234567
return answer
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스] [Level 2] N-Queen(백트래킹) (0) | 2022.06.11 |
|---|---|
| [프로그래머스] [Level 2] [2018 KAKAO BLIND RECRUITMENT 3차] 파일명 정렬 (0) | 2022.06.03 |
| [프로그래머스] [Level 2] [스택/큐] 다리를 지나는 트럭 (0) | 2022.05.27 |
| [프로그래머스] [Level 2] 큰 수 만들기 (0) | 2022.05.11 |
| [프로그래머스] [Level 2] [2018 KAKAO BLIND RECRUITMENT] n진수 게임 (0) | 2022.05.10 |