Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Cloud Run
- 다익스트라
- 컴퓨터 구조
- 삼성 SW 역량테스트
- Air Table
- 고속 푸리에 변환
- ICPC
- LCS
- 수학
- 그리디
- 백준 1753번
- REACT
- Cloud Pub/Sub
- 접미사 배열
- r
- 다이나믹 프로그래밍
- 펜윅 트리
- 우선순위 큐
- 생활코딩
- BFS
- 이분탐색
- 데이터 분석
- JavaScript
- Bit
- 삼성SW역량테스트
- CI/CD
- dp
- jpa
- 종만북
- 시뮬레이션
Archives
- Today
- Total
코딩스토리
백준 12852번 - 1로 만들기 2 본문
백준 12852번 - 1로 만들기 2
https://www.acmicpc.net/problem/12852
이 문제는 BFS, 다이나믹 프로그래밍 문제이다.
처음에는 top-down 방식으로 문제를 해결하려 했다.
문제의 조건에 맞게 코드를 짜 보았는데 마지막 출력에서 살짝 맘에 안 들었다.
출력 부분을 보면 n부터 내림차순으로 출력하는데, top-down 방식으로 해결하려면
dp[x]에는 x*3 또는 x*2 또는 x+1 이 들어가 있기 때문에 한번 vector나 배열에 다 넣고 오름차순 정렬을 해줘야 한다.
코드는 몇 줄 차이 안 나겠지만 시간 복잡도 면에서 botton-up 방식이 훨씬 좋을 것 같아서 다시 풀어보았다.
즉 다이나믹 프로그래밍을 사용하여 dp[x*3, x*2, x+1]에 x를 저장해 준다. (x는 1부터 시작)
이렇게 되면 x==n일 때 연산 횟수는 최솟값일 것이고 조건의 n제한이 10^6(1000000)이므로 시간 복잡도도 충분하다.
주의할 점은 무조건 dp[x*3, x*2, x+1]에 x를 저장하면 런타임 에러가 난다.
x*3, x*2, x+1이 10^6 보다 커질 수 있으므로 이에 대한 조건을 넣어 주어야 한다.
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
45
46
47
48
49
|
#include <iostream>
#include <queue>
#include <vector>
#pragma warning(disable:4996)
using namespace std;
int n;
int dp[1000001];
int dis[1000001];
bool check[1000001];
void bfs() {
int x = 1;
queue<int>q;
q.push(x);
check[x] = true;
dp[x] = x;
dis[x] = 0;
int dx[3];
while (1) {
x = q.front();
if (x == n)break;
q.pop();
dx[0] = x * 3;
dx[1] = x * 2;
dx[2] = x + 1;
for (int k = 0; k < 3; k++) {
int nx = dx[k];
if (nx > 1000000) continue;
if (check[nx] == false) {
check[nx] = true;
dp[nx] = x;
dis[nx] = dis[x] + 1;
q.push(nx);
}
}
}
}
int main() {
scanf("%d", &n);
bfs();
printf("%d\n", dis[n]);
printf("%d ", n);
while (n != 1) {
printf("%d ", dp[n]);
n = dp[n];
}
}
|
cs |
그래프 이론(BFS)과 다이나믹 프로그래밍을 잘 이해하고 있다면 어렵지 않게 풀 수 있다.
'알고리즘 > BOJ 문제 풀이' 카테고리의 다른 글
백준 2447번 - 별 찍기 - 10 (0) | 2020.08.26 |
---|---|
백준 14226번 - 이모티콘 (0) | 2020.08.24 |
백준 2206번 - 벽 부수고 이동하기 (0) | 2020.08.23 |
백준 11000번 - 강의실 배정 (0) | 2020.08.23 |
백준 1753번 - 최단경로 (0) | 2020.08.08 |
Comments