숫자로 이루어진 문자열 t
와 p
가 주어질 때,
t
에서 p
와 길이가 같은 부분문자열 중에서,
이 부분문자열이 나타내는 수가 p
가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.
예를 들어, t
="3141592"이고 p
="271" 인 경우,
t
의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다.
이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.
p
의 길이 ≤ 18p
의 길이 ≤ t
의 길이 ≤ 10,000t
와 p
는 숫자로만 이루어진 문자열이며, 0으로 시작하지 않습니다.로직의 효율을 위해서 t 의 첫번째 자리와 p 의 첫번째 자리만 먼저 비교한 뒤
조건이 충족되면 크기 비교를 하는 방식으로 문제를 풀어보았다.
63.2 점을 받고 실패했는데 원인이 다른 결과값이 아닌 모두 런타임 에러였다.
아마 내가 어떤 조건을 반영하지 못해서 추출해야 할 자릿수가 넘어가 버린것 같다.
class Solution {
public int solution(String t, String p) {
int answer = 0;
// 첫번째 자리 추출
char f = p.charAt(0);
// t 와 비교하기 위해 int 형으로 케스팅
int compare = Integer.parseInt(p);
// 둘을 비교하는 로직
for (int i = 0; i <= t.length() - p.length(); i++) {
// 첫번째 자리가 더 크다면 continue
if (t.charAt(i) > f) continue;
// 작거나 같다면 본격적인 값 비교
int num = Integer.parseInt(t.substring(i, i + p.length()));
if (num <= compare) answer++;
}
return answer;
}
}
아무리 문제를 꼼꼼하게 다시읽고 고민해보고 여러가지 반례를 생각해서 입력해봐도 코드상에서 문제를 찾지 못했다..
결국 검색을 통해 문제의 원인을 확인했는데 data type 을 long 으로 바꿔야 된다고 한다.
하지만 아무리 문제를 읽어봐도 long 으로 바꿔야 할 이유를 알지 못하겠다..
long 으로 바꾸니 문제를 통과하긴 했다.
p 와 t를 자라낸 값 모두 long 으로 캐스팅 해주어야 된다.
class Solution {
public int solution(String t, String p) {
int answer = 0;
char f = p.charAt(0);
long compare = Long.parseLong(p);
for (int i = 0; i <= t.length() - p.length(); i++) {
if (t.charAt(i) > f) continue;
long num = Long.parseLong(t.substring(i, i + p.length()));
if (num <= compare) answer++;
}
return answer;
}
}