TIL

20221026 TIL 점점 발전 중인 프로그래머스로 TDD하기

jiwoosmile 2022. 10. 26. 10:04

 

https://media.makeameme.org/created/tdd-is-coming.jpg

ide없이 프로그래머스 사이트에서 TDD를 하고 있는데, 조금씩 팁이 생기고 있다.

TDD를 하면 문제를 잘게 쪼개고, 쪼갠 걸 구현하다가 반복이 보여서 리팩토링하고 하면서 자연스럽게 좋은 구조의 코드가 생성된다.

일단은 test메서드를 만들어서 solution에서 이용하는 방법보다 나은 방법은 아직 찾지 못했고,

하다가 찾으면 바로 더 나은 방식으로 바꾸려고 한다.

 

실제로 제출할 때는 test메서드를 호출하는 부분을 막아야 처리되는 시간을 줄일 수 있다.

I/O는 시간이 오래걸리기 때문에 호출하지 않는 것이 좋다.

 

구조는 아직 그대로이지만 테스트를 작성하는 방식이 발전하고 있다.

기존에는 메서드: 값 구조로 출력을 했었고,

심지어 배열인 경우에 효율적으로 출력할 방법을 고민하고 있었고, 값 하나만 확인하는 형태로 테스트를 작성했었다.

System.out.println("getAllNumbers(new int[]{1,5,2,6,3,7,4}, new int[][]{{2,5,3},{4,4,1},{1,7,3}})" +
    getAllNumbers(new int[]{1, 5, 2, 6, 3, 7, 4}, new int[][]{{2, 5, 3}, {4, 4, 1}, {1, 7, 3}})[2]);

이 방식으로 테스트하면 내가 결과 값을 생각하면서 값이 맞는지 확인을 계속 해줘야 했다.

 

그래서 진화한 버전을 떠올렸다.

JUnit처럼 깔끔하진 않지만 아래 방식을 이용하면 배열 값들도 쭉 출력할 수 있고, 내가 호출한 메서드, 예상 값, 실제 값을 한 눈에 볼 수 있다.

true false로 확인하는 것은 일분 일초가 중요한 코딩테스트에서 빠르게 구현할 방법을 아직은 못 찾아서 

일단은 내가 예상 값과 실제 값이 같은지 다른지 확인을 해줘야 하지만 크게 어렵지 않고, 이전보다 훨씬 테스트 결과를 확인하기 쉬워졌다.

import java.util.*; // 필수


System.out.println("scores(new int[]{1,2,3,4,5}): new int{5,0,0} = ");
Arrays.stream(scores(new int[]{1, 2, 3, 4, 5})).forEach(System.out::println);

System.out.println("score(new int[]{1,2,3,4,5,2}, new int[]{1,2,3,4,5}): 5 = "
        + score(new int[]{1, 2, 3, 4, 5, 2}, new int[]{1, 2, 3, 4, 5}));

System.out.println("best(new int[]{1,3,2,4,2}): new int[]{1,2,3} = ");
Arrays.stream(best(new int[]{1, 3, 2, 4, 2})).forEach(System.out::println);

메서드: 예상 값 = 실제 값 구조로 출력하고,

배열의 경우 모든 값을 다 출력하는 대신 매 줄이 나뉘어 출력되긴 하지만 일단 빠르게 모든 값을 확인할 수 있다!

이런 식으로 출력된다.

배열은 출력이 깔끔하지 않지만, 글을 작성하다보니 join을 쓰면 깔끔해질 것 같은 생각이 들어서 시도해보았다.

System.out.println("best(new int[]{1,3,2,4,2}): new int[]{1,2,3} = " + 
                   Arrays.stream(best(new int[]{1, 3, 2, 4, 2}))
                   .mapToObj(String::valueOf)
                   .collect(Collectors.joining(",")));

 

여러 줄에 걸쳐 출력되던 이전에 비해 훨씬 깔끔한 것을 확인할 수 있다.

 

그리고 자주 나오는 메서드는 꼭 모아둬서 기억을 해야할 것 같다.

배열에서 가장 큰 값을 구하는 Arrays.stream(배열).max().getAsInt(); 와

박싱 언박싱

int[] primitives = {1, 2, 3};
Integer[] boxed = Arrays.stream(primitives).boxed().toArray(Integer[]::new);
int[] unboxed = Arrays.stream(boxed).mapToInt(Integer::intValue).toArray();

그리고 정렬한 인덱스 값을 알고 싶을 때 사용하는

Arrays.sort(indices, (i, j) -> Integer.compare(array[i], array[j]));

를 꼭 기억하자!

 

그리고 더 나은 방법이 있을 지 항상 고민하고 적용하자!