프로그래머스/Lv. 1

[프로그래머스 코딩테스트] 하샤드 수(Java)

Sigfriede 2023. 4. 4. 01:20

  문제 설명

  양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.

 

  제한사항

  • x는 1 이상, 10000 이하인 정수입니다.

 

  입출력 예

arr return
10 true
12 true
11 false
13 false
import java.util.ArrayList;
class Solution {
    public boolean solution(int x) {
        boolean answer = true;
        int sum = 0;
        int temp = x;
        ArrayList<Integer> arr = new ArrayList<>();
        while (temp > 0) {
            arr.add(temp % 10);
            temp /= 10;
        }
        for (int i = 0; i < arr.size(); i++) {
            sum += arr.get(i);
        }
        if (x % sum != 0) {
            answer = false;
        }
        
        return answer;
    }
}

  우선 sum과 temp 변수를 각각 만들어주었습니다. 또한 각 자릿수를 구한 값을 저장할 ArrayList를 만들었습니다.

  숫자의 자릿수를 만들어 비교하기 위하여, while문의 나머지 연산을 통해 자릿수를 구했습니다. 앞서 말했던 대로, 이를 ArrayList에 하나씩 추가했습니다. x값을 temp 변수에 할당하는 이유는 이후에도 x값을 써야하지만, while문으로 연산하면서 x값이 바뀌어버리기 때문입니다. 만약 이후에 x값을 쓸 일이 없다면 temp 변수를 쓰지 않아도 됐을 것입니다.

  for문이 arr의 크기만큼 순회합니다. 일반 배열이라면 length 혹은 문자열이라면 length()를 썼을 테지만, ArrayList는 Collection 인터페이스에 속해있으므로 size()를 사용합니다. arr에서 값을 하나씩 가져와  sum 변수에 더해줍니다.

  이후 문제의 핵심인 하샤드 수인지 비교하는 if문입니다. answer의 초기값은 true로 설정되어 있으므로, false가 반환되는 상황만 조건을 세워 answer에 false를 할당해주었습니다.

  자릿수를 구하는 부분은 다른 문제에서도 그랬듯 나머지 연산이 아닌, 숫자를 문자 혹은 문자열로 형변환하여 쪼개버리는 등으로도 풀이가 가능합니다. 하지만 단순히 자릿수만을 구하는 것이 아닌, 이후에도 숫자 연산이 필요하므로 이번에는 나머지 연산 쪽이 조금 더 효율적이지 않나 싶습니다.

  다른 분들의 풀이를 보면서 깨달았는데, arr에 저장하지 않고 바로 sum 변수에 더하기 할당을 해버려도 됩니다. 불필요한 과정이었네요. 그렇다면 for문의 계산 역시 불필요할 테구요.

class Solution {
    public boolean solution(int x) {
        boolean answer = true;
        int sum = 0;
        int temp = x;
        while (temp > 0) {
            sum += temp % 10;
            temp /= 10;
        }
        
        if (x % sum != 0) {
            answer = false;
        }
        
        return answer;
    }
}

  부랴부랴 고쳐본 코드 ㅎㅎ;