반응형
문제 설명
숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.
예를 들어, t="3141592"이고 p="271" 인 경우, t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.
제한 사항
- 1 ≤ p의 길이 ≤ 18
- p의 길이 ≤ t의 길이 ≤ 10,000
- t와 p는 숫자로만 이루어진 문자열이며, 0으로 시작하지 않습니다.
입출력 예
CODE
class Solution {
public int solution(String t, String p) {
int answer = 0;
int len = t.length() - p.length()+1;
for(int i = 0; i < len; i++) {
String num = t.substring(i, p.length()+i);
if(Long.valueOf(num) <= Long.valueOf(p)) answer++;
}
return answer;
}
}
나름의 규칙을 찾아내보고자 아이패드에 열심히 끄적였다.
분석 끝에 for문의 반복 횟수는 't의 문자열 길이 - p의 문자열 길이 + 1'이었다. for문 안의 코드는 substring()을 이용해 문자열을 잘랐다. substring()의 매개변수로 start는 i, end는 p의 길이+i의 값을 주었다. end에 p의 길이+i를 한 이유는 맨 처음에 그냥 p의 문자열의 길이로만 주었다가 런타임 에러가 계속 발생해서 다시 생각해보니 end가 start에서 end의 index만큼 자르는게 아니라, 문자열 0번째부터 end index까지 자르는게 기억나서 수정했다. 또한 valueOf()에 Integer가 아닌 Long을 사용했는데 이유는 테스트케이스에 Integer의 범위를 넘는 값들이 있어 계속 런타임 에러가 나, Long.valueOf()를 사용했다.
실행 결과
반응형