2 minute read




문제 풀이


이번 문제는 부분 문자열을 잘 활용하는 것이 핵심이다.


아이디어 도출

  • t에서 p의 길이만큼 잘라가며 부분 문자열(result)을 만든다.
  • 위에서 만든 부분 문자열(result)가 p를 정수로 변환한 값보다 작거나 같은지를 확인하여 카운트를 세면 된다.

바로 코드를 작성해보자.

1
2
3
4
int answer = 0;
int len = p.length();
int result = 0;
int target = Integer.parseInt(p);

먼저 t에서 만든 부분문자열이 p보다 작거나 같은지를 검증하여 카운트를 증가시킬 변수 answer를 초기화한다.
또한, p의 길이를 len이라는 변수에 저장하여 사용한다.
t에서 len만큼 잘라 만들 부분 문자열을 담을 result 변수를 만든다.
마지막으로 p를 정수로 담아 result와 비교하기 위한 target 변수를 만들면 된다.

1
2
3
4
5
6
for(int i=0; i<t.length(); i++) {
    if(i+len <= t.length()) {
        result = Integer.parseInt(t.substring(i, i+len));
        if(result <= target) answer++;
    }
}

이제 t를 순회하면서 p의 길이만큼 부분 문자열로 잘라서 정수로 변환한 값인 result과 p를 정수로 변환한 값인 target을 비교해가며 카운트를 세면 된다.

여기서 t를 가지고 부분문자열을 만들 때, i+len번째 문자열까지만 부분 문자열을 만들 수 있고 i+len+1번째 문자부터는 부분 문자열을 만들 수 없다는 점을 고려하여 t를 순회하면서 부분문자열을 만들도록 해야 한다.

위와 같은 코드를 테스트케이스로 돌려보니 정상적으로 원하는 리턴값을 출력할 수 있었다.
그래서 바로 코드 제출을 했는데 일부 테스트케이스에서 런타임 에러가 발생하게 되었다.


런타임 에러 해결

런타임 에러를 해결하기 위해 문제의 제한사항을 제대로 살피지 않은 것 같아 제한사항을 살펴보기로 하였다. 문제의 제한사항을 보면 아래와 같다.

  • 1 ≤ p의 길이 ≤ 18
  • p의 길이 ≤ t의 길이 ≤ 10,000
  • t와 p는 숫자로만 이루어진 문자열이며, 0으로 시작하지 않습니다.

여기서 p의 길이와 t의 길이는 10000자 이하로 이루어지기 때문에 int 값의 범위를 잘 고려했는지 확인해야 한다.

int는 최대 10자리 수까지 밖에 표현할 수 없다. 반면에 Long은 19자리까지 가능하기 때문에 Integer.parseInt()를 하는 과정에서 10자리 수를 넘어가는 경우에는 위처럼 런타임 에러가 발생하게 되었던 것이다. 그래서 Integer.parseInt() 구문을 Long.parseLong()메서드로 변환해주도록 수정하여 제출하니 정상적으로 모든 테스트케이스를 통과할 수 있었다.



작성 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.util.*;

class Solution {
    public int solution(String t, String p) {
        int answer = 0;
        int len = p.length();
        long result = 0;
        long target = Long.parseLong(p);

        for(int i=0; i<t.length(); i++) {
            if(i+len <= t.length()) {
                result = Long.parseLong(t.substring(i, i+len));
                if(result <= target) answer++;
            }
        }

        System.out.println(answer);
        return answer;
    }
    
    public static void main(String[] args){
        Solution sol = new Solution();
        String t = "500220839878";
        String p = "7";
        sol.solution(t, p);
    }
}

회고

  • 부분 문자열을 만드는 과정에서 java.lang.StringIndexOutOfBoundsException 예외가 발생할 수 있는 경우를 고려해야 했기에 i+len 번째의 인덱스까지만 부분문자열을 만들 수 있었다.
  • int와 Long 타입의 제공되는 범위를 어느정도 인지하고 있어야 문제를 푸는 시간을 단축할 수 있음을 다시 한번 느꼈다.