이 포스팅에서는 C#을 사용하여 주어진 정수를 1로 만드는 문제를 해결하는 방법을 상세히 설명하겠습니다. 이 문제는 코딩 테스트에서 자주 출제되는 유형 중 하나로, 문제 해결 능력과 알고리즘 설계 능력을 기르는 데 매우 유용합니다.
문제 설명
주어진 정수 x
를 1로 만들기 위한 연산이 여러 가지 있습니다. 각 연산은 다음과 같습니다:
- 1을 빼기 (
x => x - 1
) - 2로 나누기 (
x => x / 2
,x
가 짝수일 때 가능) - 3으로 나누기 (
x => x / 3
,x
가 3으로 나누어 떨어질 때 가능)
목표는 최소한의 연산을 통해 x
를 1로 만드는 것입니다. 예를 들어, x = 10
이라면 다음과 같은 연산을 수행할 수 있습니다:
예시:
10 → 5 (10을 2로 나누기) → 4 (5에서 1을 빼기) → 2 (4를 2로 나누기) → 1 (2에서 1을 빼기)
문제 해결 전략
이 문제를 해결하기 위한 여러 가지 접근 방법이 있지만, 가장 효율적인 방법 중 하나는 BFS(너비 우선 탐색)를 사용하는 것입니다. BFS는 최단 경로를 찾는 데 유리하며, 연산을 한 단계씩 진행하는 방식으로 문제를 해결합니다.
BFS 알고리즘 개요
BFS는 탐색할 노드를 큐에 저장하고, 가장 먼저 저장된 노드부터 차례대로 탐색하는 알고리즘입니다. 이 문제에서는 각 상태(정수)를 노드로 보고, 각 연산을 통해 도달 가능한 새로운 상태를 큐에 추가합니다. 이를 통해 1에 도달하는 최소 연산 횟수를 찾을 수 있습니다.
구현
이제 C#으로 문제를 해결하는 코드를 작성해 보겠습니다. 아래 코드는 주어진 정수 x
를 1로 만드는 최소 연산 횟수를 계산하는 함수입니다.
using System;
using System.Collections.Generic;
public class Solution {
public int MinOperations(int x) {
// 방문한 노드를 추적하기 위한 집합
HashSet visited = new HashSet();
// BFS 탐색을 위한 큐
Queue> queue = new Queue>();
// 초기 상태 (x, 0) - 현재 값과 연산 횟수
queue.Enqueue(new Tuple(x, 0));
visited.Add(x); // 초기 노드 방문 처리
while (queue.Count > 0) {
var current = queue.Dequeue();
int currentValue = current.Item1;
int operationsCount = current.Item2;
// 목표 상태인 1에 도달한 경우
if (currentValue == 1) {
return operationsCount; // 최소 연산 횟수 반환
}
// 가능한 연산 수행
// x - 1
if (currentValue - 1 >= 1 && !visited.Contains(currentValue - 1)) {
visited.Add(currentValue - 1);
queue.Enqueue(new Tuple(currentValue - 1, operationsCount + 1));
}
// x / 2
if (currentValue % 2 == 0 && !visited.Contains(currentValue / 2)) {
visited.Add(currentValue / 2);
queue.Enqueue(new Tuple(currentValue / 2, operationsCount + 1));
}
// x / 3
if (currentValue % 3 == 0 && !visited.Contains(currentValue / 3)) {
visited.Add(currentValue / 3);
queue.Enqueue(new Tuple(currentValue / 3, operationsCount + 1));
}
}
return -1; // 도달할 수 없는 경우
}
}
코드 설명
위의 C# 코드를 살펴보면, MinOperations
함수가 x
를 입력받아 최소 연산 횟수를 반환합니다. 이 함수는 BFS 탐색을 통해 정수를 1로 만드는 데 필요한 모든 연산을 수행해 나갑니다.
주요 구성 요소
- 방문 기록 (visited): 이미 탐색한 노드(정수)를 추적합니다.
- 큐 (queue): 현재 노드 및 연산 횟수를 저장하여 BFS를 진행합니다.
- 조건문: 각 연산에 대해 새로운 상태가 유효한지 (>= 1) 및 방문 여부를 확인합니다.
시간 복잡도 분석
이 알고리즘의 시간 복잡도는 최악의 경우 O(x)입니다. 각 정수에 대해 BFS를 수행하기 때문에, 최악의 경우 전부 탐색해야 할 수도 있습니다. 그러나 일반적으로는 빠른 성능을 보입니다.
결론
이번 포스팅에서는 C#을 사용하여 정수를 1로 만드는 문제를 BFS를 통해 해결하는 방법을 살펴보았습니다. 이 방법을 적용하면 최소 연산 횟수를 효율적으로 찾을 수 있으며, 알고리즘적 사고를 기르는 데 많은 도움이 됩니다. 추가적인 연습 문제를 푸는 것도 이 지식을 확장하는 좋은 방법이 될 것입니다.
이 문제를 바탕으로 다양한 변형 문제에 도전해 보시기 바랍니다. 항상 문제 해결에 대한 고민을 지속하여 더 깊은 이해를 가지시길 바랍니다!