매일 매일 하루 한 문제씩.
꾸준히 이어가는 코딩테스트 풀이 기록 ✅
꽤 오래전에 풀었었던 코딩테스트 문제.
포트폴리오 준비 기간이 끝나고 보완해야 할 내용들이 좀 있지만 그래도 코딩테스트를 손에서 놓을 수 없기 때문에 하루에 2시간 정도를 투입해서 코딩테스트 문제를 쭉 풀어보고자 한다.
풀어봤던 문제이긴 한데 매 번 새롭게 느껴지는 것도 있고. 특히 자바스크립트의 reduce 같은 경우에는 하루에 한 번 이상 풀지 않으면 며칠 내로 머릿속에서 사라지는. 어이없는 일이(ㅎㅎ) 반복되기 때문에.
되도록 내가 약한 부분을 보강하면서 하루 2시간을 보내보고자 한다.
오늘 풀었던 문제는 아마 난이도 상으론 최하에 해당할 것 같은 '하샤드 수'
사실 자바로 풀 때 엣지케이스를 발견하지 못한 코드를 작성하느라 결국 1시간 가까이 시간을 허비하게 됐고..
어떤 오류가 있는지 찾지 못한 채 다른 방법으로 해결하게 됐다.
문제, 풀이방법, 코드를 아래와 같이 공유한다.
문제.
자바(Java) 및 자바스크립트(Javascript) 풀이 방법 및 코드
자바
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개 언어로 꾸준히 코딩테스트 풀면서 실력을 높여나가자.
특히 가장 어려워 하는 알고리즘은 별도로 이론 정리해두기. 화이팅~!