147355 크기가 작은 부분문자열

알파로그·2023년 3월 12일
0

✏️ 문제 설명

숫자로 이루어진 문자열 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으로 시작하지 않습니다.

✏️ 문제 풀이

📍 1차 시도 - 실패

로직의 효율을 위해서 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;
    }
}

📍 2차 시도 - 성공

아무리 문제를 꼼꼼하게 다시읽고 고민해보고 여러가지 반례를 생각해서 입력해봐도 코드상에서 문제를 찾지 못했다..


결국 검색을 통해 문제의 원인을 확인했는데 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;
    }
}
profile
잘못된 내용 PR 환영

0개의 댓글