-
20221026 TIL 점점 발전 중인 프로그래머스로 TDD하기TIL 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]));
를 꼭 기억하자!
그리고 더 나은 방법이 있을 지 항상 고민하고 적용하자!
'TIL' 카테고리의 다른 글
20221028 TIL 제가 한 번 도커를 쉽게 설명해보겠습니다 (0) 2022.10.28 20221027 TIL 다양한 리액트 조건문 사용법 (0) 2022.10.27 20221025 TIL 신기한 JS this (0) 2022.10.25 20221024 TIL 적응 (0) 2022.10.24 20221023 TIL git을 파보다 (0) 2022.10.23