Codewars 문제풀기 (05/13)
Write Number in Expanded Form
-
int를 입력으로 받는다.
-
입력 정수를 a + b + c + d..형태의 String으로 리턴한다.
Kata.expandedForm(12) 👉 10 + 2 Kata.expandedForm(70304) 👉 70000 + 300 + 4 Kata.expandedForm(90000) 👉 90000
1. Test와 리팩토링
-
테스트 1 - 입력이 12일 때 “10 + 2” 를 리턴한다.
-
@Test @DisplayName("test should return 10 + 2 when input is 12") public void test1() { // Then: should return 10 + 2 assertEquals("10 + 2", Kata.expandedForm(12)); }
-
public class Kata { public static String expandedForm(int num) { int[] numbers = new int[(int) Math.log10(num) + 1]; for (int i = 0; i < numbers.length; i++) { numbers[i] = num % 10; num /= 10; } String result = ""; for (int i = numbers.length - 1; i >= 0; i--) { result += "" + (numbers[i] * (int) Math.pow(10, i)); if (i != 0) { result += " + "; } } return result; } }
- 배열에 각 digit을 저장하고 배열 index를 이용해서 해결했다.
-
-
테스트 2 - 입력이 70304일 때 “70000 + 300 + 4”를 리턴한다.
-
@Test @DisplayName("test should return 70000 + 300 + 4 when input is 70304") public void test2() { // Then: should return 70000 + 300 + 4 assertEquals("70000 + 300 + 4", Kata.expandedForm(70304)); }
-
public class Kata { public static String expandedForm(int num) { ... String result = ""; for (int i = numbers.length - 1; i >= 0; i--) { if (numbers[i] != 0) { result += ""+ (numbers[i] * (int)Math.pow(10, i)); if(i != 0) { result += " + "; } } return result; } }
- 배열의 element가 0이 아닌 경우에만 String을 붙여주는 것으로 수정했다.
-
-
테스트 3 - 입력이 90000일 때 “90000”을 리턴한다.
-
@Test @DisplayName("test should return 90000 when input is 90000") public void test3() { // Then: should return 90000 assertEquals("90000", Kata.expandedForm(90000)); }
-
public class Kata { public static String expandedForm(int num) { ... String result = ""; for (int i = numbers.length - 1; i >= 0; i--) { if (numbers[i] != 0) { result += "" + (numbers[i] * (int) Math.pow(10, i)) + " + "; } } return result.substring(0, result.length() - 3); } }
- 90000 같은 경우 + 가 필요없는데 +가 붙는다. 그래서 for문을 돌 때마다 +를 붙여주고 마지막에 붙은 +만 제거했다.
-
public class Kata { public static String expandedForm(int num) { int mulTimes = (int) Math.log10(num); for (int i = mulTimes; i >= 0; i--) { int pow = (int) Math.pow(10, i); int number = (num / pow) * pow; if (number != 0) { result += "" + number + " + "; } num = num % pow; } return result.substring(0, result.length() - 3); } }
- 배열에 저장할 필요가 없다고 생각해서 배열을 지웠다.
-
2. 답 비교, 느낀점
Best Practice 가장 많이 받은 코드
public class Kata
{
public static String expandedForm(int num)
{
String outs = "";
for (int i = 10; i < num; i *= 10) {
int rem = num % i;
outs = (rem > 0) ? " + " + rem + outs : outs;
num -= rem;
}
outs = num + outs;
return outs;
}
}
- 나는 “ + “ 를 뒤에 붙여주고 마지막에 제거 했다면, 이 코드는 앞부분에 붙여줬다. 그러면 1의 자리부터 시작하고 마지막에 가장 큰 수만 더해주면된다. 이 방법이 더 좋은것 같다.. 왜 이런생각을 못하냐 ㅂㄷㅂㄷ
댓글남기기