나의 Winding Road

BAEKJOON 1463번: 1로 만들기 본문

개발/Algorithm

BAEKJOON 1463번: 1로 만들기

WindingRoad 2018. 8. 30. 00:00

[2018-08-29 수요일]

* 내용: 1 만들기

1. 문제

2. 해결 방법

 


1. 문제


 

* 내용

- URL: https://www.acmicpc.net/problem/1463

 

 

2. 해결 방법


 

* 로직

- Bottom-up 방식

- 1~10까지 차례로 확인

- 1 빼는 무조건 실행 가능하므로 가장 먼저 실행 2, 3으로 나누는 실행 전까지는 최솟값

- 2, 3으로 나눌 나누고 이후의 값의 최솟값과 합산

 

* 로직 예시(예시 : 10)

- 1 연산 횟수 = 3

연산 횟수

연산식

0

-

10

1

10 - 1

9

1 + 2(arr[9]) = 3

-

1

 

- 2 나눌 연산 횟수 = 4

연산 횟수

연산식

0

-

10

1

10 / 2

5

1 + 3(arr[5]) = 4

-

1

 

* 이슈

- 배열 동적 할당 사이즈 설정 미스

- 해결 방법: 소스 수정

변경

변경

int* arr = new int[n];

int* arr = new int[n + 1];



 

* 소스 코드

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <string>
#include <vector>
#include <regex>
#include <stack>
#include <list>
#include <cmath>
 
using namespace std;
 
int main() {
 
    int n;
 
    cin >> n;
    
    if (n < 1 || n > 1000000) {
        return 0;
    }
    
    int* arr = new int[n + 1];
 
    arr[1= 0;
 
    for (int i = 2; i <= n; i++) {
        if (i - 1 > 0) {
            arr[i] = 1 + arr[i - 1];
        }
        
        if (i % 2 == 0) {
            int temp = 1 + arr[i / 2];
            arr[i] = min(arr[i], temp);
        }
 
        if (i % 3 == 0) {
            int temp = 1 + arr[i / 3];
            arr[i] = min(arr[i], temp);
        }
    }
 
    cout << arr[n];
 
    return 0;
}
cs

'개발 > Algorithm' 카테고리의 다른 글

BAEKJOON 10825번: 국영수  (0) 2018.09.04
BAEKJOON 9465번: 스티커  (0) 2018.09.02
로봇 청소기  (0) 2017.04.17
BAEKJOON 1260번: DFS와 BFS  (1) 2017.04.17
BAEKJOON 13458번: 시험 감독  (0) 2017.04.09
Comments