(리팩토링) 코드로 문제 해결 연습 | 크기가 작은 부분 문자열

주싱·2022년 12월 31일
0

코드로 문제 해결 연습 | 크기가 작은 부분 문자열 리팩토링

개선 포인트

  • for문을 이용해 직접 구현한 toSubNumbers() 메서드 대신 IntStream을 활용합니다. 그래서 코드가 어떻게 보다 무엇에 집중하도록 하여 가독성을 높이고, for 루프의 제어 흐름을 이해해야 하는 인지 부하(작은 부분이지만)를 줄입니다.
  • 문제에 명시된 제약사항을 코드의 Asssertion 문으로 작성해 봄으로 의식적으로 문제의 제약사항을 바르게 인지하는 습관을 기릅니다.

개선한 코드

public int solution(String target, String sub) {
    assert sub.length() >= 1 && sub.length() <= 18;
    assert target.length() >= sub.length() && target.length() <= 10000;
    assert sub.charAt(0) != '0' && target.charAt(0) != '0';

    return (int) IntStream.range(0, target.length() - sub.length() + 1)
                          .mapToObj(startIndex -> target.substring(startIndex, startIndex + sub.length()))
                          .map(Long::parseLong)
                          .filter(number -> number <= Long.parseLong(sub))
                          .count();
}

기존 코드

public int solution(String target, String sub) {
    assert target.length() >= sub.length();
    int subLen = sub.length();
    long subNumber = Long.parseLong(sub);
    List<Long> subNumbers = toSubNumbers(target, subLen);
    return (int) subNumbers.stream()
                           .filter(number -> number <= subNumber)
                           .count();
}

private List<Long> toSubNumbers(String target, int subLen) {
    List<Long> numbers = new ArrayList<>();

    for (int start = 0; start + subLen <= target.length(); start++) {
        Long number = Long.parseLong(target.substring(start, start + subLen));
        numbers.add(number);
    }
    return numbers;
}

profile
소프트웨어 엔지니어, 일상

0개의 댓글