1. 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
2. 문제 해석
- 받은 숫자의 각 자리수의 합이 나누어 떨어져야한다.
- 예를들어 1111을 받으면 1+1+1+1 = 4, 1111이 4로 나누어 떨어지면 하샤드 수 이다.
- 그럼 각 자리수를 더해서 직접 나누어 보면 되지않을까?
3. 첫번째 풀이
class Solution {
public boolean solution(int x) {
boolean answer = true;
int x2 = x;
int tmp = 0;
if (x > 1000) {
int a = x/1000;
tmp += a; //1000자리
x -= a * 1000;
}
if (x > 100) {
int a = x/100;
tmp += a; //100자리
x -= a * 100;
}
if (x > 10) {
int a = x/10;
tmp += a; //10자리
x -= a * 10;
}
tmp += x;
if (x2%tmp == 0) {
answer = true;
} else {
answer = false;
}
return answer;
}
}
- 입력받는 수의 조건이 10000미만이므로 1000의 자리까지 구하면된다.
- 각 자리수의 합은 tmp 변수에 저장한다.
- 그렇다면 원래 숫자를 tmp로 나누었을때 나머지가 0이면 true
근데 중복되는 코드수가 많고, 비효율적이지 않나?
각 자리수의 합을 꼭 저렇게 구해야할까?
4. 두번째 풀이
class Solution {
public boolean solution(int x) {
boolean answer = true;
String[] strX = String.valueOf(x).split("");
int sum = 0;
for(int i=0; i<strX.length; i++) {
sum += Integer.parseInt(strX[i]);
}
if(x%sum==0) {
answer = true;
} else {
answer = false;
}
return answer;
}
}
- String으로 바꾸고 하나씩 나누면, 각 자리수의 숫자가 된다.
- 그걸 더할때는 Integer로 바꿔서 더하면 각 자리수의 합이 된다.
음... 자바에서 배열의 모든 숫자를 더하는 메서드가 있지 않을까?
5. 세번째 풀이
import java.util.*;
class Solution {
public boolean solution(int x) {
String[] strX = String.valueOf(x).split("");
int sum = Arrays.stream(strX).mapToInt(Integer::parseInt).sum();
if(x%sum==0) {
return true;
} else {
return false;
}
}
}
- Java8의 Stream쪽에 그러한 메서드가 있다.
- 또한 boolean 변수를 제거하고 바로 리턴을 하도록 수정하였다.