안녕하세요.
21회차 과제 "하샤드 수"입니다.
문제 설명
양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다.
예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다.
자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.
제한 사항
x는 1 이상, 10000 이하인 정수입니다.
풀이
//1차 시도
class Solution {
public boolean solution(int x) {
boolean answer = true;
String str = String.valueOf(x);
for(int i=0; i<=x.length;i++ ){
if (x % (x[i] + x[i+1])==0){
answer = true;
} else {
answer = false;
}
}
return answer;
}
}
당연히 실행조차 되지 않았습니다...
그러다 예전에 자릿수 더하기 문제를 풀었던 기억이 생각났고 x를 자릿수를 전부 더한 값으로 하면 된다는 생각을 했습니다.
//2차 시도
class Solution {
public boolean solution(int x) {
boolean answer = true;
int sum = 0;
while(true){
sum += x%10;
if (x<10) break;
x/=10;
}
if (x%sum==0){
answer = true;
} else {
answer = false;
}
return answer;
}
}
테스트 코드 실행에서 12의 값을 false라고 출력하여 실패
x%sum 에서 sum을 지우고 3이라고 입력(x%3)하고 실행해도 false를 출력했습니다.
하지만 x를 지우고 12를 입력(12%sum)한 경우에는 true를 출력하였습니다...뭐지??
x의 값의 변화를 주는 코드가 없는데 왜그런가 한참 고민했지만... 결국 원인을 찾지 못했습니다.
//3차시도
class Solution {
public boolean solution(int x) {
boolean answer = true;
int sum = 0;
String[] num = Integer.toString(x).split("");
for (int i=0; i<num.length; i++){
sum+= Integer.parseInt(num[i]);
}
if (x % sum != 0){
answer = false;
}
return answer;
}
}
드디어 성공!
자릿수 더하기에 관하여 다른 코드가 있었던 기억이 나서 해당 코드로 변경하였고 answer값도 기본적으로 true값으로 설정되어있기에 조건에 일치하지 않을 경우에만 false 값으로 출력하도록 변경하였습니다.
1. 정수를 문자열 데이터로 변환하는 동시에 Split하여 자릿수별로 나누어 줍니다.
2. 나누어준 자릿수를 문자 데이터에서 정수 데이터로 변환하는 동시에 각 자릿수를 더해줍니다.
3. x의 값을 자릿수의 합으로 나누어 나머지가 있는 경우 answer값을 false로 변환합니다.
배운 것
이전에 배운것을 배웠다고 해서 넘어가는 것이 아니라 내 기억 속에 저장해두는 것이 중요하다.
최소한 어떤 것을 해봤지 라는 정도라도 기억한다면 이전의 글들을 되짚어가며 응용문제를 풀 수 있는 방안이 될 것이다.
저처럼 처음해보시는 분들에게 이 글이 조금이나마 도움이 되었으면 좋겠습니다.
'내일배움캠프 > Daily Routine (알고리즘)' 카테고리의 다른 글
[내일배움캠프] 알고리즘 Daily Routine 23. 콜라스 추측 (0) | 2024.09.05 |
---|---|
[내일배움캠프] 알고리즘 Daily Routine 22. 두 정수 사이의 합 (0) | 2024.09.04 |
[내일배움캠프] 알고리즘 Daily Routine 20. 정수 내림차순으로 배치하기 (0) | 2024.08.29 |
[내일배움캠프] 알고리즘 Daily Routine 19. 정수 제곱근 판별 (0) | 2024.08.28 |
[내일배움캠프] 알고리즘 Daily Routine 18. 문자열을 정수로 바꾸기 (0) | 2024.08.28 |
댓글