링크 : 프로그래머스 > 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이다.