일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- 카카오
- 네트워크 관리사 2급
- KT
- 싸피
- python
- 리얼클래스
- 신문스크랩
- 싸피셜
- html
- 구글
- 인앱결제
- SSAFY 7기
- 코딩테스트 연습
- Java
- 코딩테스트
- SSAFY
- 신문 스크랩
- java 객체지향 프로그래밍
- it 뉴스
- IT 동향
- 우테코
- IT 트렌드
- 프로그래머스
- 네트워크 관리사
- 네트워크 관리사 2급 실기
- 코테
- SSAFYcial
- 백준위
- 백준
- it 이슈
- Today
- Total
개발자일걸요..?
1463번 1로 만들기 본문
문제링크 : www.acmicpc.net/problem/1463
1463번: 1로 만들기
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
www.acmicpc.net
<알고리즘>
결과값을 계산해 놓는 배열이용 & 최소의 경우 +1로 횟수 늘려가기
1) 결과값을 계산할 배열을 선언 & 초기화
2) index가 0, 1 일 경우는 0으로 고정 시켜놓기
3) index가 2이 이상일 경우부터, 1씩 뺏을 경우(즉, d[index-1]의 값 +1)로 일단 변경
3-1) 혹시 i가 3으로 나누어지며, d[index//3]+1의 값이 앞서 변경해놓은 값보다 작을 경우 변경
3-2) 혹시 i가 2으로 나누어지며, d[index//2]+1의 값이 앞서 변경해놓은 값보다 작을 경우 변경
4) index가 N이 될때까지 쭉 수행 후, d[N]값 출력
ex) N이 6일 경우,
d[0]~d[5]까지는 앞서 결과값이 나와있는 상태 있음
(d[0]=0 d[1]=0 d[2]=1 d[3]=1 d[4]=2 d[5] = 3)
i = 6인 상황,
3) d[6] = d[5]+1 = (d[4]+1)+1 = ((d[3]+1)+1)+1 = (((d[2]+1)+1)+1)+1 =4
3-1) i%3==0 , d[6] = (d[2])+1 = 2
3-2) i%2==0 , d[6] = (d[3])+1 = (d[1]+1)+1 = 2
=> d[6] = 2
위에선 쉬운 이해를 위해 계산 순서를 풀어써서 반복이 많아보이지만
실제론 앞에서 부터 계산 했기 때문에 시간복잡도는 O(N)이다
메모리 : 37024KB 시간 : 528ms
import sys
N = int(sys.stdin.readline())
d = [0 for _ in range(N+1)]
for i in range(2,N+1):
d[i]=d[i-1]+1
if(i%3==0 and d[i//3]+1<d[i]):
d[i] = d[i//3]+1
elif(i%2==0 and d[i//2]+1<d[i]):
d[i] = d[i//2]+1
print(d[N])
+) 참고 : 메모이제이션 알고리즘 hongku.tistory.com/161
알고리즘 :: 다이나믹 프로그래밍(DP) - 피보나치(Fibonacci) C/C++ 구현, 메모이제이션
다이나믹 프로그래밍 DP Dinamic Programing, 다이나믹 프로그래밍이란... 문제를 한번만 푸는 알고리즘 쉽게 생각하면, 점화식을 생각하면 된다. 중학교 수학을 배우면서 우리는 점화식에 대해 배운
hongku.tistory.com
'알고리즘코딩 > Baekjoon Online Judge' 카테고리의 다른 글
1655번 가운데를 말해요 (0) | 2021.03.09 |
---|---|
11286번 절댓값 힙 (0) | 2021.03.08 |
1927번 최소 힙 (0) | 2021.03.06 |
11279번 최대 힙 (0) | 2021.03.05 |
9461번 파도반 수열 (0) | 2021.03.04 |