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

주싱·2022년 12월 30일
0

링크 : 프로그래머스 > Level 1 > 크기가 작은 부분 문자

문제

숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요. 예를 들어, t="3141592"이고 p="271" 인 경우, t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.

소요 시간

25분

문제 해결 코드

import java.util.ArrayList;
import java.util.List;

class Solution {
    
    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;
    }
}

해결과정 회고

문제를 해결하는 코드를 15분 정도의 시간에 빠르게 작성할 수 있었는데 특정 테스트 케이스에서 런타임 오류가 났다. 먼저 문자열을 스캔하는 index 범위를 초과하지는 않는지 확인했지만 문제가 없었다. 다음으로 제약 사항을 읽어보았는데 언뜻 문제의 원인이 될만한 것이 보이지 않았다. 좀더 들여다 보니 부분 문자열 숫자의 길이가 18자리까지 될 수 있음을 인지 할 수 있었고 내 코드에서는 int 형 변수를 사용하고 있음을 알 수 있었다. int 대신 long 형을 사용하여 문제를 해결할 수 있었다.

개선할 점

문제의 제약사항을 유심히 읽어보고 코드 상에서 주의해야하는 점을 먼저 파악해야할 필요가 있겠다.

잘한점

문제가 발생했을 때 문제의 제약사항을 신중히 읽어본 것이 문제를 해결할 수 있었던 핵심적인 이유가 되었다.

학습한 것

long 형 변수(부호가 있는)가 표현할 수 있는 최대 자릿수는 18(19자리의 일부 수 표현 가능)자리이며 가장 큰 수는 9,223,372,036,854,775,808이다. int 형변수(부호가 있는)가 표현할 수 있는 최대 자릿수는 9(10자리 숫자 일부 표현 가능)자리이며 가장 큰 수는 2,147,483,648이다.

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

0개의 댓글