C# 백준 1463 1로 만들기
2023. 11. 7. 17:01ㆍC# 백준 알고리즘
문제
정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.
- X가 3으로 나누어 떨어지면, 3으로 나눈다.
- X가 2로 나누어 떨어지면, 2로 나눈다.
- 1을 뺀다.
정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.
입력
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
출력
첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.
예제 입력 1
2
예제 출력 1
1
예제 입력 2
10
예제 출력 2
3
힌트
10의 경우에 10 → 9 → 3 → 1 로 3번 만에 만들 수 있다.3
이 문제를 봤을때 BFS나 DFS를 이용해서 경우의수를 풀면 되겠구나 싶었다
3으로 나누어 떨어질때 결과값
2로 나누어 떨어질때 결과값
그리고 1로 뺄때의 결과값
모든 경우의수를 둬서 BFS문제로 풀었다.
그래서 여기서 1을 먼저 도착한 결과값이 무조건 빠르거나 같으니깐 이값을 최소값으로 리턴하였다.
금방 풀고 원트만에 통과해서 쉬웠던 문제였던거 같다.
하지만 모든 경우의수를 둬서 그런가 메모리와 시간처리가 되게 느렸던거 같다.
이 문제의 코드이다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Prob_1463_1로_만들기
{
class Program
{
static int BFS(int number)
{
Queue<int> min = new Queue<int>();
Queue<int> result = new Queue<int>();
int resultMinValue = 0;
min.Enqueue(0);
result.Enqueue(number);
while(result.Count > 0)
{
int minvalue = min.Dequeue();
int value = result.Dequeue();
if (value == 1)
{
resultMinValue = minvalue;
break;
}
if (value % 3 == 0)
{
min.Enqueue(minvalue + 1);
result.Enqueue(value / 3);
}
if (value % 2 == 0)
{
min.Enqueue(minvalue + 1);
result.Enqueue(value / 2);
}
min.Enqueue(minvalue + 1);
result.Enqueue(value - 1);
}
return resultMinValue;
}
static void Main(string[] args)
{
int n = int.Parse(Console.ReadLine());
int min = BFS(n);
Console.WriteLine(min);
}
}
}
'C# 백준 알고리즘' 카테고리의 다른 글
C# 백준 10025 게으른 백곰 (0) | 2024.02.23 |
---|---|
C# 백준 3190 뱀 (2) | 2024.02.21 |
C# 백준 2775 부녀회장이 될테야 (0) | 2023.08.19 |
C# 백준 1312 소수 (0) | 2023.08.16 |
C# 백준 1260 DFS와 BFS (0) | 2023.08.16 |