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

안녕하세요, 여러분. 이번 강좌에서는 C++로 구현할 수 있는 알고리즘 문제 중 하나인 “정수를 1로 만들기” 문제를 다루어 보겠습니다. 이 문제는 취업 준비를 위한 코딩 테스트에서 자주 출제되는 유형 중 하나로, 다양한 사고방식을 요구합니다. 따라서 이 문제를 풀면서 기본적인 알고리즘 설계 및 트리밍 기술을 향상시키고, C++ 프로그래밍 실력을 키울 수 있습니다.

문제 설명

정수 x가 주어질 때, 다음 두 가지 연산을 이용하여 정수를 1로 만들려고 합니다:

  • 짝수 x가 주어지면 x를 2로 나눈다.
  • 홀수 x가 주어지면 x에서 1을 뺀다.

연산은 1회만 수행 가능하며, 상기 연산을 반복하여 x를 1로 만드는 최소 횟수를 구하는 문제입니다. 단, x의 범위는 1 이상 106 이하입니다.

입력


x = 10

출력


result = 5

문제 접근 방법

이 문제를 해결하기 위해서는 재귀적인 접근 방법 또는 반복문을 통해 x를 1로 만들어가는 과정에서 최소 횟수를 계산해야 합니다. 알고리즘을 구현하기 위해 다음 단계들을 고려해볼 수 있습니다.

1. 기본 알고리즘 설계

처음에는 x가 홀수인지 짝수인지를 판단하고 해당 조건에 따라 적절한 연산을 적용합니다. 이 과정을 반복하면서 x가 1이 될 때까지의 카운트를 증가시킵니다. 재귀적으로 구현할 수도 있지만, for문을 사용하는 것이 더 간단할 수 있습니다.

2. 시간 복잡도 분석

이 알고리즘의 시간 복잡도는 x의 값을 따릅니다. x가 최대 10^6이므로, 최대 20회 이하로 연산이 수행될 것입니다. 이는 매우 효율적인 방법입니다.

C++ 코드 구현

이제 위의 알고리즘을 C++로 구현해보겠습니다. 아래 코드는 주어진 정수를 1로 만드는 데 필요한 최소 연산 횟수를 계산합니다.

#include 
using namespace std;

int makeOne(int x) {
    int count = 0; // 연산 횟수를 세기 위한 변수
    while (x > 1) { // x가 1보다 클 경우 계속 반복
        if (x % 2 == 0) { // x가 짝수일 경우
            x /= 2; // x를 2로 나눈다
        } else { // x가 홀수일 경우
            x -= 1; // x에서 1을 뺀다
        }
        count++; // 연산 횟수 증가
    }
    return count; // 최종 연산 횟수 반환
}

int main() {
    int x;
    cout << "정수를 입력하세요: ";
    cin >> x; // 사용자로부터 정수 입력 받기
    int result = makeOne(x); // makeOne 함수 호출
    cout << "정수를 1로 만드는 최소 연산 횟수: " << result << endl; // 결과 출력
    return 0;
}

코드 설명

위의 코드는 주어진 정수 x를 인자로 받아 해당 정수를 1로 만드는 최소 연산 횟수를 구하는 makeOne 함수를 정의하고 있습니다. while 반복문을 통해 x가 1보다 클 경우 연산을 계속 수행하며, 매 반복마다 연산 횟수를 기록합니다. 이를 통해 최종적으로 1로 만들기 위한 총 연산 횟수를 반환합니다.

테스트 및 검증

이제 여러 테스트 케이스로 코드가 제대로 작동하는지 확인해보겠습니다.


정수를 입력하세요: 10
정수를 1로 만드는 최소 연산 횟수: 5

정수를 입력하세요: 15
정수를 1로 만드는 최소 연산 횟수: 8

정수를 입력하세요: 1
정수를 1로 만드는 최소 연산 횟수: 0

결론

이번 강좌에서는 “정수를 1로 만들기” 알고리즘 문제를 해결해보았습니다. 이 문제를 통해 C++의 기초적인 문법과 알고리즘 설계, 그리고 코드 구현 방법을 다루었습니다. 알고리즘 문제를 해결하는 과정에서 마주치는 다양한 상황들과 이를 극복하기 위한 방법들을 항상 고민하는 것이 중요합니다. 문제 해결 능력을 키우기 위해 다양한 문제를 풀어보시기를 권장합니다. 다음 강좌에서도 유익한 내용을 가지고 돌아오겠습니다. 감사합니다!