하샤드 수 (자바)

김재현·2024년 4월 17일
0

알고리즘 풀이

목록 보기
70/89
post-custom-banner

문제

틀린 풀이

import java.util.*;

class Solution {
    public boolean solution(int x) {
        boolean answer = true;

        int[] xArr = String.valueOf(x).chars().toArray();
        
        int xSum = Arrays.stream(xArr).sum();
        
        if(x%xSum != 0) {
            answer = false;
        }
        
        return answer;
    }
}

처음에 이것으로 제출했을 때 모두 false가 되었다.
왜 그런지 출력해서 확인해봤는데, 10을 입력했을 때 xArr이 뜬금없이 97이 되는 것이다.

고민해보니 chars()이후 toArray()에서 int로 변환이 되는데, 아스키 코드로 대응되기 때문이다.
'1'과 '0'의 아스키 코드 값이 각각 49와 48이니, 이것을 합쳐서 97이 되었던 것이다.

그렇다면 stream으로 계속 풀이하기엔 너무 복잡해 질 것 같았다.
( 이 때 - '0' 하면 되었는데..!! -> 다른 사람 풀이에 계속)
String을 split으로 나누어서 풀이해야겠다고 생각했다.

정답 코드

import java.util.*;

class Solution {
    public boolean solution(int x) {
        boolean answer = true;

        String[] xStrArr = String.valueOf(x).split("");
        
        int sum = 0;
        for(String a : xStrArr) {
            sum+=Integer.parseInt(a);
        }
        
        if(x%sum != 0) {
            answer = false;
        }
        
        return answer;
    }
}

다른 사람 풀이

class Solution {
    public boolean solution(int x) {
        int sum = String.valueOf(x).chars().map(ch -> ch - '0').sum();
        return x % sum == 0;
    }
}
  1. 아아앗! 나도 map으로 char를 int로 변환 시도해봤으나, 너무 오랜만의 알고리즘이라 -'0'이 아닌 -''라고 사용해서 프로그램이 인식하지 못했던 것이었다..!
  2. 그리고 int 배열로 바꿀 필요 없이 바로 sum()하면 되는구나? Stream 적용되어 있다는 것을 잘 활용해야겠다.
  3. return을 참/거짓으로 바로 저렇게 해도 좋겠구나!
profile
I live in Seoul, Korea, Handsome
post-custom-banner

0개의 댓글