[알고리즘 스터디 1주 차] 하샤드 수

     

     

     

    코딩테스트 연습 - 하샤드 수

    양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하

    programmers.co.kr

     

     

    🐤나의 풀이

    1. 사용자가 입력한 값을 split을 이용해 배열에 담는다.
    2. 배열의 길이만큼 반복문을 실행하고 앞에 선언한 변수(test)에 해당 값들을 더한다.
    3. 입력 값 % test == 0 이면 true 그게 아니라면 false를 반환한다.
    class Solution {
        public boolean solution(int x) {
    
            boolean answer = true;
            int test = 0;
            String [] xArr = (x+"").split("");
        
            for(int i=0;i<xArr.length;i++){
                test += Integer.parseInt(xArr[i]);
            }
        
            return x % test == 0 ? true:false;
        }
    }

     

    사용자가 입력한 int x라는 매개변수를 활용해서 int형 변수인 x의 값에 ""를 추가하여 문자열 화하고 다시 split함수를 이용해 ""를 제거하였다. split메소드를 이용해 나눠진 x의 값이 String 배열인 xArr에 담긴다.   

    String [] xArr = (x+"").split("");

     

    반복문을 이용해서 test에 xArr [i] 번째의 값들을 더하여, x 나누기 test의 나머지가 0이라면 true, 아니라면 false를 반환하도록 삼항 연산자를 사용했다. 


    💻 스터디를 통해 새롭게 알게 된 것

     

    방법 1

    class Solution {
        public boolean solution(int x) {
            return x % sumOfDigits(x)  == 0;
            // x를 자리수의 합으로 나눴을 때 나머지를 0으로 return 하기
        }
        private int sumOfDigits(int x){
            // x의 자리수의 합을 리턴하는 함수
            // 문제를 조금씩 작은 문제로 만들어나가자
            int sum = 0;
            String s = String.valueOf(x);
            for(int i=0; i<s.length();i++){
                char ch = s.charAt(i);
                
                //ch는 문자이기 때문에, 문자에서 숫자로 바꾸기 위해 0을 빼준다.
                // = 0이라는 문자를 빼준다. 그리고 그 값을 sum에 담아준다.
                // 각 자리수의 합이 더해진다.
                sum += ch -'0'; 
            }
            return sum;
        }
    }

     

    방법 2

    그런데, ch에서 0을 빼는 게 좋은 코드일까? 다른 방식은 없을까?

    Character.getNumericValue()
    숫자 형태의 char를 int형태로 변환한다.

    따라서 ch - '0'을 하지 않아도 문자에서 숫자로 바꿀 수 있고, 이것을 int형 변수인 sum에 담을 수 있다.

     

    기존의 반복문에서 향상된 for문으로 바꿔보자.

    toCharArray()
    문자열을 char형 배열로 바꿔준다. 반환되는 배열의 길이는 문자열의 길이와 같다.
    for(char ch : s.toCharArray()){
        sum += Character.getNumericValue(ch);
        }

     

    방법 3

    자릿수의 합을 꼭 String으로 처리해야 할 필요가 있을까?

     

    예를 들어 218의 자릿수의 합을 구한다면,

     

    (218 % 10) == 8

    (218 / 10) == 21

    (21 % 10) == 1

    (21 / 10) == 2

    (2 % 10) == 2

    (2 / 10) == 0

     

    다음과 같이 구하는 나머지를 이용해서 각각의 자릿수를 구하면 된다. 

    private int sumOfDigits(int x){
            int sum = 0;
            while(x>0){
                sum += x % 10;
                x /= 10;
            }
            return sum;
        }

     


    💭 1주 차 후기

     

    좋은 코드의 절대적인 기준이 있는 것이 아니다. 내가 어떤 목적을 가지고 코드를 작성했는지에 따라 달라진다. 그렇기 때문에, 내가 만든 프로그램이 어떤 환경에서, 어떤 목적을 가지고 동작하는지를 알고 설계하는 것이 중요하다!

     

    여러 문제를 푸는 것보다 같은 문제를 다른 풀이로 여러 번 푸는 것이 중요하다고 말씀해주셨는데,

    그 이유를 알 것 같다. 하나의 문제에 이렇게 많은 풀이 방법이 있다니 😂 

    차근차근 포기하지 않으면 되겠지!

    첫술에 배부르려고 하지 말고 천천히 소화시켜서 내 지식으로 만들어보자. 

     

    728x90

    댓글