코딩테스트연습/프로그래머스

[프로그래머스 - JAVA] 하샤드 수

:)jun 2021. 11. 18. 23:30

https://programmers.co.kr/learn/courses/30/lessons/12947

 

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

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

programmers.co.kr

//테스트 코드

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

class Quiz1_하샤드수Test {
	
	Quiz1_하샤드수 q;

	@BeforeEach
	void setUp() throws Exception {
		q = new Quiz1_하샤드수();
	}

	@Test
	void test1() {
		assertTrue(q.solution(1));
	}
	@Test
	void test10() {
		assertTrue(q.solution(10));
	}
	@Test
	void test12() {
		assertTrue(q.solution(12));
	}
	@Test
	void test11() {
		assertFalse(q.solution(11));
	}
	@Test
	void test13() {
		assertFalse(q.solution(13));
	}
	

}

프로덕션 코드
public class Quiz1_하샤드수 {
	 public boolean solution(int x) {
		  return checkHashad(sumOfNumber(x), x);
	 }
	 
	 public int sumOfNumber(int x) {
		 if(x%10==0) {
			 return x;
		 }
		 return sumOfNumber(x/10) + (x%10);
	 }
	 
	 public boolean checkHashad(int sumOfNumber, int x) {
		 if(x%sumOfNumber==0) {
			 return true;
		 }
		 return false;
	 }
	 
}

// 테스트코드 통과, 히든케이스 3개 미통과. 생각하지 못한 부분이 어디있을까?
// 아이고... x%10==0 일때 바로 리턴해버리면 x=1230 일때 그대로 나가네! 수정하자.

public class Quiz1_하샤드수 {
	 public boolean solution(int x) {
		  return checkHashad(sumOfNumber(x), x);
	 }
	 
	 public int sumOfNumber(int x) {
		 if(x/10==0) {
			 return x;
		 }
		 return sumOfNumber(x/10) + (x%10);
	 }
	 
	 public boolean checkHashad(int sumOfNumber, int x) {
		 if(x%sumOfNumber==0) {
			 return true;
		 }
		 return false;
	 }
	 
}

//굿! 이제 처음 보는 사람도 금방 이해 할 수 있도록 리팩토링 해보자.

public class Quiz1_하샤드수 {
	 public boolean solution(int x) {
		  return checkHashad(sumOfEachDigit(x), x);
	 }
	 
	 public int sumOfEachDigit(int x) {
		 if(checkUnitDigit(x)) {
			 return x;
		 }
		 return sumOfEachDigit(x/10) + (x%10);   //이름을 붙여주고 싶었으나 오히려 복잡해져서 참았다.
	 }

	 private boolean checkUnitDigit(int x) {
		return x/10==0;
    }
	 
	 private boolean checkHashad(int sumOfNumber, int x) {
		 if(x%sumOfNumber==0) {
			 return true;
		 }
		 return false;
	 }
	 
}

//정확한 명칭으로 메서드 이름을 변경하였고 의미를 직접 찾아야 하는 수식보다는 이름을 붙여줘 처음 보는 사람도 쉽게 이해할 수 있도록 하였다.