12852번: 1로 만들기 2
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 자연수 N이 주어진다.
www.acmicpc.net
- 3가지 경우의 수에 대해서 BFS 를 통해 최소 거리를 구할 수 있고, 연산 도중 문자열을 통해 경로를 저장해나가며 풀 수 있다.
- DP 로 풀 수도 있는데, 2 부터 N 까지 각 위치까지의 최소 경로를 저장해나가며 반복한다.
- 현재 위치 i + 각 케이스 별 (이전까지의 최소 경로 + 현재까지의 경로) 들 중 최소 경로가 i 의 최소 경로가 된다.
#include <iostream>
#include <queue>
using namespace std;
int N, temp, count;
int visited[1000001];
int main(void)
{
cin >> N;
queue<pair<int, string>> q;
q.push({N, ""});
while(true)
{
int sz = q.size();
for(int s = 0 ; s < sz ; s++) // bfs
{
int cur = q.front().first;
string answer = q.front().second;
q.pop();
if(cur == 1) // 1 에 도착할 시
{
cout << count << endl << answer + "1" << endl; // 연산 횟수 및 경로 출력 후 종료
return 0;
}
temp = cur-1;
if(!visited[temp]) // 3번 케이스
{
visited[temp] = true;
q.push({temp, answer + to_string(cur) + " "});
}
if(cur % 2 == 0) // 2번 케이스
{
temp = cur / 2;
if(!visited[temp])
{
visited[temp] = true;
q.push({temp, answer + to_string(cur) + " "});
}
}
if(cur % 3 == 0) // 1번 케이스
{
temp = cur / 3;
if(!visited[temp])
{
visited[temp] = true;
q.push({temp, answer + to_string(cur) + " "});
}
}
}
count++;
}
}
'PS > BOJ' 카테고리의 다른 글
[백준] 1449 : 수리공 항승 (0) | 2021.05.14 |
---|---|
[백준] 1717 : 집합의 표현 (0) | 2021.05.12 |
[백준] 2263 : 트리의 순회 (0) | 2021.05.07 |
[백준] 11404 : 플로이드 (0) | 2021.05.06 |
[백준] 1080 : 행렬 (0) | 2021.05.05 |