두 개의 숫자 start와 end가 범위 변수로 주어지고, 정수 q가 입력으로 주어집니다. 목표는 범위 내에서 해당 숫자 자체의 자릿수와 그 숫자에 q를 곱한 값의 자릿수 사이에 공통된 숫자가 하나도 없는 수를 찾아 그 개수를 세는 것입니다.
예를 들어 숫자가 5이고 q가 3이라면 곱은 15가 됩니다. 이때 5와 15는 공통 자릿수 '5'를 가지므로 조건에 맞지 않습니다.
반면 숫자가 2이고 q가 5라면 곱은 10이 됩니다. 2와 10은 공통 자릿수가 없으므로 조건을 만족합니다.
예제로 이해하기
예제 1
입력: start = 5, end = 10, q = 2
출력: 범위 내에서 자릿수와 q를 곱한 값의 자릿수가 서로 다른 수의 개수: 5
설명: 조건을 만족하는 숫자는 다음과 같습니다.
- 5 (5 × 2 = 10)
- 6 (6 × 2 = 12)
- 7 (7 × 2 = 14)
- 8 (8 × 2 = 16)
- 9 (9 × 2 = 18)
예제 2
입력: start = 20, end = 25, q = 5
출력: 범위 내에서 자릿수와 q를 곱한 값의 자릿수가 서로 다른 수의 개수: 2
설명: 조건을 만족하는 숫자는 다음과 같습니다.
- 22 (22 × 5 = 110)
- 23 (23 × 5 = 115)
프로그램의 접근 방식
이 접근 방식에서는 start부터 end까지 차례대로 순회하면서 각 숫자와 그 숫자에 q를 곱한 값을 문자열로 변환합니다. 그런 다음 현재 숫자의 각 자릿수 등장 횟수를 저장할 배열 arr[26]을 생성합니다. 이후 곱(현재 숫자 × q)의 문자열을 순회하면서 해당 문자열의 어떤 문자라도 arr[]에서 0이 아닌 값을 가진다면 공통 자릿수가 존재하는 것이므로 0을 반환하고, 그렇지 않으면 1을 반환합니다.
- 범위 변수(start, end)와 값 q를 입력받습니다.
- 함수 check(int i, int q)는 숫자 i와 q를 받아 i의 자릿수와 곱(q × i)의 자릿수가 공통되지 않으면 1을 반환합니다.
- str = to_string(i)을 사용하여 i를 문자열로 변환합니다.
- 곱(temp = q × i)을 str_2 = to_string(temp)으로 문자열로 변환합니다.
- str의 문자 개수를 저장할 빈도 배열 arr[26] = {0}을 선언합니다.
- for 루프로 str을 순회하며 arr[str[j] - '0']++로 각 자릿수의 빈도를 갱신합니다.
- for 루프로 str_2를 순회하며 arr[str_2[j] - '0']이 0이 아닌 값이 있는지 확인합니다. 있다면 공통 자릿수가 존재하므로 0을 반환합니다.
- 공통 자릿수가 없다면 1을 반환합니다.
- 함수 unequal(int start, int end, int q)는 범위 변수와 q를 받아 범위 내에서 자릿수와 q를 곱한 값의 자릿수가 서로 다른 수의 개수를 반환합니다.
- 초기 count를 0으로 설정합니다.
- for 루프로 i = start부터 i = end까지 숫자를 순회합니다.
- check(i, q)를 호출하여 숫자 i와 그 곱이 공통 자릿수를 갖지 않는지 확인하고, 조건을 만족하면 count를 증가시킵니다.
- 마지막에 count를 결과로 반환합니다.
예제 코드
#include <bits/stdc++.h>
using namespace std;
int check(int i, int q) {
string str = to_string(i);
int length = str.size();
int arr[26] = {
0
};
int temp = i * q;
string str_2 = to_string(temp);
int length_2 = str_2.size();
for (int j = 0; j < length; j++) {
arr[str[j] - '0']++;
}
for (int j = 0; j < length_2; j++) {
if (arr[str_2[j] - '0']) {
return 0;
}
}
return 1;
}
int unequal(int start, int end, int q) {
int count = 0;
for (int i = start; i <= end; i++) {
if (check(i, q)) {
count++;
}
}
return count;
}
int main() {
int start = 20, end = 40, q = 4;
cout << "범위 내에서 자릿수와 q를 곱한 값의 자릿수가 서로 다른 수의 개수: " << unequal(start, end, q);
return 0;
}
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
출력
범위 내에서 자릿수와 q를 곱한 값의 자릿수가 서로 다른 수의 개수: 1