양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.
x는 1 이상, 10000 이하인 정수입니다.| x | return |
|---|---|
| 10 | true |
| 12 | true |
| 11 | false |
| 13 | false |
입출력 예 #1
10의 모든 자릿수의 합은 1입니다. 10은 1로 나누어 떨어지므로 10은 하샤드 수입니다.
입출력 예 #2
12의 모든 자릿수의 합은 3입니다. 12는 3으로 나누어 떨어지므로 12는 하샤드 수입니다.
입출력 예 #3
11의 모든 자릿수의 합은 2입니다. 11은 2로 나누어 떨어지지 않으므로 11는 하샤드 수가 아닙니다.
입출력 예 #4
13의 모든 자릿수의 합은 4입니다. 13은 4로 나누어 떨어지지 않으므로 13은 하샤드 수가 아닙니다.
※ 공지 - 2023년 5월 27일 문제 지문 오탈자 수정되었습니다.
출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
class Solution {
public boolean solution(int x) {
String[] arr = (x+"").split("");
int[] arrNum = new int[arr.length];
int h = 0;
for(int i =0;i<arr.length;i++){
arrNum[i] = Integer.parseInt(arr[i]);
h += arrNum[i];
}
return x % h == 0;
}
}
자릿수를 다 더해준 값으로 나눠지는지 확인해야 하므로 자릿수를 어떻게 더해줄까 고민하다가 배열에 담아서 더해줘야 겠다고 생각했다.
x + ""로 String값으로 바꾸고 split을 통해 자릿수를 각각 String 배열에 담아줬다.
int배열에 Integer로 파싱한 값으로 변환해 담아주고 h에 더해주고 이 h가 x를 나눌 수 있는지 없는지 return해준다.

class Solution {
public boolean solution(int x) {
int staticx = x;
int h = 0;
while(x>0){
h += x%10;
if(x < 10){break;}
x/=10;
}
return staticx % h == 0;
}
}
while문으로 x값을 나누어주기 때문에 처음 x값을 staticx에 저장해준다.
h에 x를 10으로 나눈 나머지를 더해주는데 반복문 안에서 x를 10으로 나눠주고 x가 10보다 작으면 break해준다.
staticx가 자릿수를 더한 h로 나눠지는지 return해준다.

👀 시간 및 성능 차이 발생 이유
- 문자열로 변환하는 추가적인 비용 발생
- 1에 의해 문자열 -> 정수 파싱 작업 필요
- 문자열 배열, 정수 배열 메모리 추가 필요
🐾 배운 점
이렇게 두 풀이를 비교할 수 있었던 이유는 코드 카타 시간에 이미 풀었던 문제를 제출해야 해서 다른 풀이로도 풀어볼까 싶어서 다른 방법으로도 풀어서 제출했기 때문이다.
두번째가 예전에 풀었던 풀이고 오늘 첫번째 풀이로 제출했는데 시간이 각 문제 당 너무 커서 두 풀이를 비교해보기 시작했다.
오늘 풀이는 굳이 필요하지 않은 과정이 많이 포함되어있다.
자릿수를 더해줘야 한다는 생각에 배열로 담아서 더할까 싶은 생각이었다.
오늘 직접 눈으로 시간과 성능에 대해 볼 수 있어서 좋았다. 앞으로는 코딩테스트 준비할 때 문제를 맞추는 것도 중요하지만 내가 불필요하게 메모리를 쓰고 있는 건 아닌지, 오버 헤드 작업이 있는 건 아닌지 등을 고려해야 겠다.