문제출처 : https://www.acmicpc.net/problem/1463


1. 문제요약

- 연산1. 3으로 나누어 지면 3으로 나눔

  연산2. 2로 나누어 지면 2로 나눔

  연산3. 1을 뺌

- 위 연산 3가지를 이용하여 N을 1로 만드는 최소 횟수

- 1 <= N <= 10^6


2. 접근방법

- bfs

  N에서 N/3, N/2, N-1을 1을 만날때 까지 bfs

=> N과 N이 1로 가는 모든 과정들이 2나 3으로 무조건 나누어 떨어진다고 하면,

     N -> N/3, N/2, N-1 3개의 숫자로 뻗어나감(큐에 3개씩 저장)

     방문한 숫자는 다시 방문할 필요가 없으므로 10^6 만큼 시간이 걸림

     (물론 1을 만나자마자 bfs를 그만 두면 좀 더 빠를거임)


- dp

  N이 1이 되는 최소 횟수는 N/3, N/2, N-1 중에 최솟값 + 1

  d[n] : n이 1이 되는 횟수 로 정의한다면

  d[n] = min(d[n-1], d[n/2], d[n/3]) + 1


3. 시간복잡도

- bfs나 dp 모두 최악 N


4. 회고

- d[n] + 1 을 안해줘서 한참 고민했네...



소스코드 : dp bottom up



[출처 : BOJ, 문제에 대한 모든 권리는 BOJ(acmicpc.net, startlink)에 있음]

'먹고살려면 > boj' 카테고리의 다른 글

BOJ 11727 2xn 타일링2  (0) 2018.01.15
BOJ 11726 2xn 타일링  (0) 2018.01.12
BOJ 2573 빙산  (1) 2018.01.05
BOJ 1389 케빈 베이컨의 6단계 법칙  (0) 2018.01.04
BOJ 9205 맥주 마시면서 걸어가기  (0) 2018.01.03

+ Recent posts