221214 프로그래머스 하샤드 수(자바, 자바스크립트)

샨티(shanti)·2022년 12월 14일
0

코딩테스트

목록 보기
1/35

매일 매일 하루 한 문제씩.
꾸준히 이어가는 코딩테스트 풀이 기록 ✅

꽤 오래전에 풀었었던 코딩테스트 문제.
포트폴리오 준비 기간이 끝나고 보완해야 할 내용들이 좀 있지만 그래도 코딩테스트를 손에서 놓을 수 없기 때문에 하루에 2시간 정도를 투입해서 코딩테스트 문제를 쭉 풀어보고자 한다.

풀어봤던 문제이긴 한데 매 번 새롭게 느껴지는 것도 있고. 특히 자바스크립트의 reduce 같은 경우에는 하루에 한 번 이상 풀지 않으면 며칠 내로 머릿속에서 사라지는. 어이없는 일이(ㅎㅎ) 반복되기 때문에.
되도록 내가 약한 부분을 보강하면서 하루 2시간을 보내보고자 한다.

오늘 풀었던 문제는 아마 난이도 상으론 최하에 해당할 것 같은 '하샤드 수'
사실 자바로 풀 때 엣지케이스를 발견하지 못한 코드를 작성하느라 결국 1시간 가까이 시간을 허비하게 됐고..
어떤 오류가 있는지 찾지 못한 채 다른 방법으로 해결하게 됐다.

문제, 풀이방법, 코드를 아래와 같이 공유한다.


문제.


자바(Java) 및 자바스크립트(Javascript) 풀이 방법 및 코드

  • 주어진 수를 String 타입으로 변환
  • 문자열을 split() 메서드로 배열화
  • 해당 배열의 원소를 다시 int로 변환함과 동시에 총 합을 구함
  • 주어진 수를 위에서 구한 총 합으로 나눈 나머지가 0인지 아닌지를 return

자바

import java.util.*;

class Solution {
    public boolean solution(int x) {
        int number = process(x);

        return x % number == 0;
    }

    public int process(int x) {
        String[] numbers = Integer.toString(x).split("");

        int sum = Arrays.stream(numbers).map(Integer::parseInt).mapToInt(number -> number).sum();

        return sum;
    }
}

자바스크립트

function solution(x) {
  const total = x.toString().split('')
    .map((a) => Number(a))
    .reduce((accumulator, current) => accumulator + current, 0);

  return x % total === 0;
}

아래 자바 코드는 로직의 어떤 부분이 잘못된 지 아직 발견하지 못해서 실페한 코드인데.. 일부는 되고 일부는 안되고. 왜 그런지 잘 모르겠다. 나름대로 엣지케이스를 찾아보려고 테스트코드에서도 몇가지 수를 더 얹어봤는데 아직 발견하지 못함.

// 안되는 코드!!!!!!!
import java.util.*;

class Solution {
    public boolean solution(int x) {
        int accumulator = 0;
        
        int number = process(x, accumulator);

        return x % number == 0;
    }

// 이 솔루션이 왜 안되는건지 너무 궁금하다. 엣지케이스가 무엇인지 잘 모르겠음...
   public int process(int x, int accumulator) {
       int exponent = (int) Math.log10(x);
       int dividend = (int) Math.pow(10, exponent);

       accumulator += x / dividend;
       int remain = x % dividend;

       if (remain / 10 == 0) {
           accumulator += remain;
           return accumulator;
       }

       if (remain / 10 != 0) {
           process(remain, accumulator);
       }

       return accumulator;
   }
}


뭘까... 뭘 놓치고 있는건지...
우선 하루에 사용하려고 했던 2시간을 초과하는 범위라 pass.
예전 방식에서 새롭게 시도해본 것은 reduce.
7월달에 풀었던 문제라 워낙 오래 전이기도 하고, 그 땐 reduce 발작버튼(ㅋㅋ)이 있어서 정말 쳐다도 보기 싫었는데.

이제는 좋건 싫건 활용할 줄 알아야 하기 때문에 뭔가 '재귀'의 스멜이 나는 것 같다!? 싶으면 reduce를 떠올려보게 됨.

내일도 난이도가 아주 높진 않을 것 같은데.. 하루에 2개 언어로 꾸준히 코딩테스트 풀면서 실력을 높여나가자.
특히 가장 어려워 하는 알고리즘은 별도로 이론 정리해두기. 화이팅~!

profile
가벼운 사진, 그렇지 못한 글

0개의 댓글