범위 [l, r]과 정수 k가 주어졌을 때, l부터 r 사이(l ≤ 숫자 ≤ r)에 있는 숫자 중에서 그 숫자를 뒤집은 값과 원래 숫자의 차이가 k의 배수가 되는 모든 숫자를 찾는 것이 목표입니다.
이 조건을 확인하려면 l부터 r까지 각 숫자를 순회하면서 해당 숫자의 뒤집은 값을 계산합니다. 그다음 뒤집은 값에서 원래 숫자를 뺀 절댓값이 k로 나누어떨어지는지(|차이| % k == 0) 검사하고, 만족한다면 카운트를 증가시킵니다.
예제를 통해 자세히 이해해 보겠습니다.
입력 − L=21, R=25, K=6
출력 − 조건을 만족하는 숫자 개수 − 2
설명 −
각 숫자, 뒤집은 값, 그리고 차이는 다음과 같습니다: 21, 12, | 21-12 |=9, 9%6!=0 22, 22, | 22-22 |=0, 0%6=0 → count=1 23, 32, | 32-23 |=9, 9%6!=0 24, 42, | 42-24 |=18, 18%6=0 → count=2 25, 52, | 52-25 |=27, 27%6!=0 조건을 만족하는 숫자는 총 2개입니다 (22, 24)
입력 − L=11, R=15, K=5
출력 − 조건을 만족하는 숫자 개수 − 1
설명 −
유일하게 조건을 만족하는 숫자는 11입니다. | 11-11 |=0이고 0%5=0이므로 조건을 충족합니다.
알고리즘 접근 방법
범위를 정의하는 두 정수 L과 R, 그리고 나눗셈 검사를 위한 K를 입력받습니다.
countNumbers(int l, int r, int k) 함수는 l, r, k를 매개변수로 받아 조건을 만족하는 숫자의 개수를 반환합니다.
초기 카운트(count)를 0으로 설정합니다.
뒤집은 숫자를 저장할 변수 rev를 0으로 초기화합니다.
나머지를 저장할 변수 rem을 0으로 초기화합니다.
i = l부터 i = r까지 반복문을 실행합니다.
현재 숫자 i를 num에 저장하고, rev를 0으로 초기화합니다.
while(num > 0) 루프를 사용해 num을 뒤집습니다: rem = num % 10, rev = rev * 10 + rem, num = num / 10.
while 루프가 종료되면 rev에는 i의 뒤집은 값이 저장됩니다.
rev와 원래 값 i의 절댓값 차이를 계산하여, | i - rev | % k == 0이면 카운트를 증가시킵니다.
범위 내의 모든 숫자에 대해 위 과정을 반복합니다.
최종적으로 누적된 count 값을 반환합니다. 이것이 뒤집은 수와의 차이가 k의 배수가 되는 숫자들의 개수입니다.
예제 코드
#include <iostream>
using namespace std;
int countNumbers(int l, int r, int k){
int rev = 0;
int count=0;
int rem=0;
for (int i = l; i <= r; i++){
int num=i;
rev=0;
while (num > 0){
// 숫자를 뒤집는 과정
rem=num%10;
rev = rev * 10 + rem;
num /= 10;
}
if((abs(i-rev))%k==0) // 원래 숫자는 i, 뒤집은 숫자는 rev
{ count++; }
}
return count;
}
int main(){
int L= 18, R = 24, K = 6;
cout <<" 뒤집은 수와의 차이가 k의 배수인 숫자의 개수:"<<countNumbers(L,R,K);
return 0;
}실행 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다 −
뒤집은 수와의 차이가 k의 배수인 숫자의 개수:4