x를 x의 자릿수의 합으로 나눴을 때, 나누어 떨어지는 경우가 하사드의 수이다.
기본 아이디어는 x%10으로 자릿수를 나눈 다음에 전부 더해줘서 그걸 x로 나눠주면 된다.
여기서 나눠줬을 때의 값과 x의 값을 분리해야 한다는 중요 점이 있다.
그러니까,
while(xx > 0){
sum = sum + (xx%10);
xx = xx / 10;
}
여기에서 xx에다가 x의 값을 옮겨줘야 한다는 것이다. 만일 x를 그대로 쓸 경우 나머지가 0인지 아닌지 분간하는 연산에서 나머지가 무조건 0이 되는 경우가 발생할 수 있다(...).
제일 먼저 작성한 코드는 벡터를 이용했다. 사실, 벡터 없이 쉽게 풀 수 있는 문제인데 앞에 푼 문제들이 대부분 벡터를 사용해서 나도 모르게 벡터를 썼다(무의식의 힘이란...).
두 번째 작성한 코드는 벡터 없이 바로 while문 안에서 더하기를 해주었다. 코린이인 내가 봐도 두 번째 코드가 더 좋은 코드로 보인다.
#include <string>
#include <vector>
#include <iostream>
using namespace std;
bool solution(int x) {
vector<int>v;
bool answer = true;
int xx = x;
int sum = 0;
int mod = 0;
//벡터에다가 나머지 값을 넣어준다.
while(xx > 0){
v.push_back(xx%10);
xx = xx / 10;
}
//나머지 값 전부 더하기
for(int i = 0; i < v.size(); i++){
sum = sum + v[i];
}
//만일 x와 합 값으로 나눈 값이 0이 아니면, false
if(x%sum != 0){
answer = false;
}
return answer;
}
#include <string>
#include <vector>
#include <iostream>
using namespace std;
bool solution(int x) {
int xx = x;
int sum =0;
while(xx > 0){
sum = sum + (xx%10);
xx = xx / 10;
}
return (x % sum == 0) ? true : false;
}