C# 코딩테스트 강좌, 정수를 1로 만들기

이 포스팅에서는 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를 통해 해결하는 방법을 살펴보았습니다. 이 방법을 적용하면 최소 연산 횟수를 효율적으로 찾을 수 있으며, 알고리즘적 사고를 기르는 데 많은 도움이 됩니다. 추가적인 연습 문제를 푸는 것도 이 지식을 확장하는 좋은 방법이 될 것입니다.

이 문제를 바탕으로 다양한 변형 문제에 도전해 보시기 바랍니다. 항상 문제 해결에 대한 고민을 지속하여 더 깊은 이해를 가지시길 바랍니다!