[알고리즘] 10. 숫자 처리와 자리수

[알고리즘] 10. 숫자 처리와 자리수

지난 글에서는 문자열 자르기와 비교에 대해 정리했습니다. 이번 글에서는 알고리즘 문제에서 자주 등장하는 숫자 처리자리수에 대해 알아보겠습니다.

숫자 문제는 단순 계산처럼 보이지만, 실제로는 나머지 연산, 몫 연산, 자리수 분리, 문자열 변환 등을 함께 사용하는 경우가 많습니다. 특히 각 자리수를 하나씩 확인해야 하는 문제는 알고리즘 기초 구현에서 매우 자주 나옵니다.

숫자 처리의 핵심은 몫과 나머지를 이용해 원하는 자리의 값을 분리하는 것입니다.

1. 숫자 처리에서 자주 나오는 상황

알고리즘 문제에서 숫자는 단순히 더하고 빼는 용도로만 나오지 않습니다. 아래처럼 숫자의 구조를 분석해야 하는 경우가 많습니다.

  • 각 자리수의 합 구하기
  • 숫자를 뒤집기
  • 특정 숫자가 몇 번 나오는지 세기
  • 짝수와 홀수 판단하기
  • 배수 여부 확인하기
  • 숫자를 문자열로 바꿔 처리하기
  • 문자열 숫자를 정수로 바꾸기

예를 들어 12345라는 숫자가 있을 때 각 자리수를 분리하면 다음과 같습니다.

12345 → 1, 2, 3, 4, 5

이런 작업을 할 때 나머지 연산과 나눗셈이 자주 사용됩니다.


2. 나머지 연산으로 마지막 자리 구하기

정수의 마지막 자리를 구할 때는 % 10을 사용합니다.

int num = 12345;

int last = num % 10;

System.out.println(last);

출력 결과는 다음과 같습니다.

5

12345를 10으로 나누면 나머지는 5입니다. 즉 num % 10은 숫자의 마지막 자리를 가져오는 역할을 합니다.

숫자 숫자 % 10 마지막 자리
12345 5 5
782 2 2
90 0 0
정수의 마지막 자리는 숫자 % 10으로 구할 수 있습니다.

3. 나눗셈으로 마지막 자리 제거하기

마지막 자리를 제거하고 싶을 때는 / 10을 사용합니다. 정수끼리 나누면 소수점 아래는 버려집니다.

int num = 12345;

num = num / 10;

System.out.println(num);

출력 결과는 다음과 같습니다.

1234

12345를 10으로 나누면 1234가 됩니다. 즉 마지막 자리 5가 제거된 것입니다.

숫자 숫자 / 10 결과
12345 1234 마지막 자리 제거
1234 123 마지막 자리 제거
123 12 마지막 자리 제거
정수의 마지막 자리를 없앨 때는 숫자 / 10을 사용합니다.

4. 각 자리수 하나씩 분리하기

이제 % 10과 / 10을 함께 사용하면 숫자의 각 자리수를 하나씩 분리할 수 있습니다.

int num = 12345;

while (num > 0) {
    int digit = num % 10;
    System.out.println(digit);

    num = num / 10;
}

출력 결과는 다음과 같습니다.

5
4
3
2
1

마지막 자리부터 하나씩 분리하기 때문에 5, 4, 3, 2, 1 순서로 출력됩니다.

동작 흐름은 다음과 같습니다.

현재 num num % 10 num / 10
12345 5 1234
1234 4 123
123 3 12
12 2 1
1 1 0

num이 0이 되면 더 이상 분리할 자리수가 없으므로 반복이 끝납니다.


5. 각 자리수의 합 구하기

각 자리수를 분리할 수 있다면 자리수의 합도 쉽게 구할 수 있습니다.

int num = 12345;
int sum = 0;

while (num > 0) {
    int digit = num % 10;
    sum += digit;

    num = num / 10;
}

System.out.println(sum);

출력 결과는 다음과 같습니다.

15

12345의 각 자리수는 1, 2, 3, 4, 5입니다. 이 값을 모두 더하면 15가 됩니다.

1 + 2 + 3 + 4 + 5 = 15

자리수 합 문제는 숫자 처리에서 가장 기본적인 유형입니다.


6. 숫자 뒤집기

숫자를 뒤집는 문제도 자주 등장합니다. 예를 들어 12345를 54321로 바꾸는 문제입니다.

마지막 자리부터 꺼낸 뒤, 기존 결과에 10을 곱하고 새로운 자리수를 더하면 됩니다.

int num = 12345;
int reversed = 0;

while (num > 0) {
    int digit = num % 10;

    reversed = reversed * 10 + digit;

    num = num / 10;
}

System.out.println(reversed);

출력 결과는 다음과 같습니다.

54321

동작 흐름을 보면 다음과 같습니다.

꺼낸 digit reversed 계산 reversed 값
5 0 * 10 + 5 5
4 5 * 10 + 4 54
3 54 * 10 + 3 543
2 543 * 10 + 2 5432
1 5432 * 10 + 1 54321
숫자 뒤집기는 기존 결과에 10을 곱한 뒤 새 자리수를 더하는 방식으로 만들 수 있습니다.

7. 특정 숫자 개수 세기

숫자 안에 특정 자리수가 몇 번 나오는지 세는 문제도 있습니다. 예를 들어 122333이라는 숫자에서 3이 몇 번 나오는지 세어보겠습니다.

int num = 122333;
int target = 3;
int count = 0;

while (num > 0) {
    int digit = num % 10;

    if (digit == target) {
        count++;
    }

    num = num / 10;
}

System.out.println(count);

출력 결과는 다음과 같습니다.

3

각 자리수를 하나씩 꺼내면서 target과 같은지 비교하면 됩니다.

이 방식은 특정 숫자 등장 횟수, 짝수 자리 개수, 홀수 자리 개수 등을 구할 때도 사용할 수 있습니다.


8. 짝수와 홀수 판단하기

숫자가 짝수인지 홀수인지 판단할 때는 % 2를 사용합니다.

int num = 7;

if (num % 2 == 0) {
    System.out.println("짝수");
} else {
    System.out.println("홀수");
}

출력 결과는 다음과 같습니다.

홀수

2로 나누었을 때 나머지가 0이면 짝수, 1이면 홀수입니다.

조건 의미
num % 2 == 0 짝수
num % 2 != 0 홀수

9. 배수 여부 확인하기

어떤 숫자가 특정 수의 배수인지 확인할 때도 나머지 연산을 사용합니다.

int num = 15;

if (num % 3 == 0) {
    System.out.println("3의 배수입니다.");
}

15는 3으로 나누어떨어지므로 3의 배수입니다.

3의 배수입니다.

배수 판단은 아래처럼 생각하면 됩니다.

조건 의미
num % 3 == 0 3의 배수
num % 5 == 0 5의 배수
num % 10 == 0 10의 배수

알고리즘 문제에서는 조건에 맞는 배수를 찾거나, 특정 배수를 제외하는 문제에서 자주 사용됩니다.


10. 숫자를 문자열로 바꿔 처리하기

자리수 문제는 숫자 연산으로도 풀 수 있지만, 문자열로 바꾸면 더 쉽게 처리할 수 있는 경우도 있습니다.

int num = 12345;

String str = String.valueOf(num);

for (int i = 0; i < str.length(); i++) {
    System.out.println(str.charAt(i));
}

출력 결과는 다음과 같습니다.

1
2
3
4
5

문자열로 바꾸면 앞자리부터 차례대로 처리하기 쉽습니다. 반대로 숫자 연산을 사용하면 뒷자리부터 처리하기 쉽습니다.

방식 특징
숫자 연산 % 10, / 10을 사용해 뒤에서부터 처리
문자열 변환 charAt()을 사용해 앞에서부터 처리
자리수를 앞에서부터 봐야 한다면 문자열 변환이 편할 수 있습니다.

11. 문자 숫자를 정수로 바꾸기

문자열로 바꾼 숫자의 각 문자는 char 타입입니다. 문자 '5'를 숫자 5로 바꾸려면 '0'을 빼면 됩니다.

char ch = '5';

int digit = ch - '0';

System.out.println(digit);

출력 결과는 다음과 같습니다.

5

이 방법을 사용하면 문자열로 된 숫자의 자리수 합도 구할 수 있습니다.

String str = "12345";
int sum = 0;

for (int i = 0; i < str.length(); i++) {
    int digit = str.charAt(i) - '0';
    sum += digit;
}

System.out.println(sum);

출력 결과는 다음과 같습니다.

15
문자 숫자를 정수로 바꿀 때는 문자 - '0'을 사용할 수 있습니다.

12. 문자열 숫자를 정수로 바꾸기

문자열 전체를 정수로 바꿔야 할 때는 Integer.parseInt()를 사용할 수 있습니다.

String str = "12345";

int num = Integer.parseInt(str);

System.out.println(num + 10);

출력 결과는 다음과 같습니다.

12355

문자열 "12345"가 정수 12345로 변환되었기 때문에 숫자 계산이 가능합니다.

만약 숫자가 int 범위를 넘을 수 있다면 long을 사용하는 것이 안전합니다.

String str = "12345678900";

long num = Long.parseLong(str);

System.out.println(num);

알고리즘 문제에서 큰 수가 나오는 경우 int 범위를 먼저 의심해보는 습관이 필요합니다.


13. 자릿수 개수 구하기

숫자가 몇 자리인지 구하는 방법도 자주 사용됩니다. 가장 쉬운 방법은 문자열로 바꿔 길이를 확인하는 것입니다.

int num = 12345;

String str = String.valueOf(num);

System.out.println(str.length());

출력 결과는 다음과 같습니다.

5

숫자 연산만으로도 구할 수 있습니다. 10으로 계속 나누면서 몇 번 나누었는지 세면 됩니다.

int num = 12345;
int count = 0;

while (num > 0) {
    count++;
    num = num / 10;
}

System.out.println(count);

출력 결과는 5입니다.

다만 num이 0인 경우에는 while문이 한 번도 실행되지 않으므로 따로 처리해야 합니다.

int num = 0;
int count = 0;

if (num == 0) {
    count = 1;
} else {
    while (num > 0) {
        count++;
        num = num / 10;
    }
}

System.out.println(count);
숫자 0도 한 자리 숫자라는 점을 놓치지 않아야 합니다.

14. 숫자 처리에서 자주 하는 실수

숫자 처리 문제에서는 아래 실수를 자주 하게 됩니다.

  • 마지막 자리를 구할 때 % 10을 사용해야 하는데 / 10을 사용하는 경우
  • 마지막 자리를 제거해야 하는데 % 10을 사용하는 경우
  • 숫자 0의 자릿수를 처리하지 않는 경우
  • int 범위를 넘는 큰 수를 int로 처리하는 경우
  • 문자 '5'와 숫자 5를 혼동하는 경우
  • 문자열 숫자를 계산하기 전에 정수로 변환하지 않는 경우

특히 자리수 문제에서는 % 10/ 10의 역할을 정확히 구분해야 합니다.

연산 역할
num % 10 마지막 자리 구하기
num / 10 마지막 자리 제거하기

15. 정리

이번 글에서는 숫자 처리와 자리수에 대해 정리했습니다.

  • num % 10은 마지막 자리를 구할 때 사용한다.
  • num / 10은 마지막 자리를 제거할 때 사용한다.
  • % 10과 / 10을 반복하면 각 자리수를 분리할 수 있다.
  • 자리수 합, 숫자 뒤집기, 특정 숫자 개수 세기는 기초 구현에서 자주 등장한다.
  • 숫자를 문자열로 바꾸면 앞자리부터 처리하기 쉽다.
  • 문자 숫자를 정수로 바꿀 때는 ch - '0'을 사용할 수 있다.
  • 문자열 전체를 정수로 바꿀 때는 Integer.parseInt()나 Long.parseLong()을 사용한다.
  • 숫자 0도 한 자리라는 점을 예외 처리해야 한다.

숫자 처리 문제는 복잡한 알고리즘보다 기본 연산을 정확히 이해하는 것이 중요합니다. 몫과 나머지의 역할을 구분할 수 있으면 자리수 문제의 대부분을 차근차근 해결할 수 있습니다.

숫자 처리의 기본은 % 10으로 마지막 자리를 꺼내고, / 10으로 다음 자리로 이동하는 것입니다.

다음 글 예고

다음 글에서는 카운팅 배열에 대해 알아보겠습니다.

숫자나 문자의 등장 횟수를 빠르게 세는 방법, 빈도수 계산의 기본 구조를 예제로 정리해보겠습니다.