문제 개요
이 튜토리얼에서는 하나의 숫자를 두 부분으로 나누되, 앞부분은 첫 번째 수로, 뒷부분은 두 번째 수로 각각 나누어 떨어지도록 하는 프로그램을 C++로 작성해 보겠습니다.
문자열 형태의 숫자 하나와 정수 두 개가 주어집니다. 프로그램은 주어진 숫자를 두 부분으로 분할할 수 있는지 판단해야 합니다. 즉, 첫 번째 부분(접두사)은 첫 번째 정수로 나누어 떨어지고, 두 번째 부분(접미사)은 두 번째 정수로 나누어 떨어져야 합니다.
문제 해결 접근 방식
문제를 해결하는 단계는 다음과 같습니다.
- 숫자 문자열과 나눗셈에 사용할 두 개의 정수를 초기화합니다.
- 첫 번째 부분이 첫 번째 수로 나누어 떨어질 때까지 문자열을 왼쪽부터 차례대로 탐색합니다.
- 각 문자를 숫자로 변환하면서 누적하여 수를 만듭니다.
- 첫 번째 수로 나누어 떨어지는 지점을 찾으면 반복문을 종료합니다.
- 이어서 다음 인덱스부터 나머지 부분(두 번째 부분)을 탐색합니다.
- 첫 번째 부분과 동일한 방식으로 두 번째 수를 만듭니다.
- 두 번째 부분이 두 번째 수로 나누어 떨어지는지 검사합니다.
- 두 조건을 모두 만족하면 두 부분을 출력하고, 하나라도 만족하지 않으면 "Not possible"을 출력합니다.
C++ 구현 예제
전체 코드는 다음과 같습니다.
#include <bits/stdc++.h>
using namespace std;
void checkTheDivisabilityOfPrefixAndSuffix(string num, int prefix_dividend, int suffix_dividend) {
int N = num.length();
bool is_prefix_divisable = false, is_suffix_divisable = false;
int index = 0;
int prefix = num[index] - '0';
while (index < N) {
if (prefix % prefix_dividend == 0) {
is_prefix_divisable = true;
break;
}
prefix = prefix * 10 + (num[++index] - '0');
}
int suffix = num[++index] - '0';
while (index < N - 1) {
suffix = suffix * 10 + (num[++index] - '0');
}
cout << suffix << endl;
if (suffix % suffix_dividend == 0) {
is_suffix_divisable = true;
}
if (is_prefix_divisable && is_suffix_divisable) {
cout << prefix << " " << suffix << endl;
}
else {
cout << "Not possible" << endl;
}
}
int main() {
string number = "125333";
int prefix_dividend = 5;
int suffix_dividend = 3;
checkTheDivisabilityOfPrefixAndSuffix(number, prefix_dividend, suffix_dividend);
return 0;
}
코드 설명
함수 checkTheDivisabilityOfPrefixAndSuffix는 먼저 문자열의 첫 자리부터 시작해 prefix 값을 만들어 가며, prefix % prefix_dividend == 0이 되는 순간 반복을 멈춥니다. 이후 남은 자릿수를 이어 붙여 suffix를 구성한 뒤, suffix % suffix_dividend == 0인지 확인합니다. 두 조건이 모두 참이면 두 부분을 출력하고, 하나라도 실패하면 "Not possible"을 출력합니다.
실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
125 333
숫자 "125333"의 경우, 앞부분 "125"는 5로 나누어 떨어지고(125 ÷ 5 = 25), 뒷부분 "333"은 3으로 나누어 떨어집니다(333 ÷ 3 = 111). 따라서 두 부분이 성공적으로 출력됩니다.
마무리
이 튜토리얼에서는 문자열로 주어진 숫자를 두 개의 나눗셈 조건을 만족하는 접두사와 접미사로 분할하는 방법을 알아보았습니다. 이 접근 방식은 한 번의 순회로 각 부분을 구성하므로 효율적입니다. 진행 중 궁금한 점이 있다면 댓글로 남겨주세요.