[프로그래머스] 크기가 작은 부분 문자열

·2023년 1월 9일
0

프로그래머스

목록 보기
11/59

📌 문제 설명

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

📌 입출력 예

tpresult
"3141592""271"2
"500220839878""7"8
"10203""15"3

📌 코드

class Solution
{
    public int solution(String t, String p)
    {
       int answer = 0;
       String str = "";
       for(int i = 0; i < t.length() - p.length() + 1; i++)
       {
           str = t.substring(i,i + p.length());
           if(str.charAt(0) == '0') {
               if(str.length() == 1)
                   str = "0";
               else {
                   str = "";
                   for(int j = 1; j < p.length(); j++)
                       str = str.concat(t.substring(j, j+1));
               }
           }
               if(Long.parseLong(str) <= Long.parseLong(p))
                   answer++;
       }
       return answer;
    }
}

📌 문제 해결 과정

💡 매 반복에서 p의 길이만큼 문자열을 잘라야 하니까 반복문을 p의 길이 + 1 만큼만 반복하게 해 준다 -> 시작 인덱스로 사용할 수 있는 최대값이다

💡 p의 길이만큼 자른 t의 문자열을 str에 넣고, 만약 str의 첫 문자가 0일 때 p의 길이가 1이라면 잘라진 문자는 0밖에 없으니 str에 0을 넣어 주고, 다른 경우에는 0을 빼고, 0을 뺀 뒷 문자부터 p의 길이만큼 str에 concat()을 사용해 붙여 준다

💡 이후, strp에 들어 있는 문자열을 long 타입으로 바꿔 준 후 비교해 p의 수가 더 크다면 answer을 +1 하게 해 준다 (p의 길이의 제한 때문에 int형을 사용하면 런타임 에러가 발생해 long 타입으로 캐스팅해 문제를 풀게 되었다

문제를 다 푼 후에 다른 분들의 코드를 몇 가지 보게 되었는데... 나는 코드를 효율적으로 짜는 방법을 많이 연습해야겠다는 생각이 들었다 내 코드만 너무 구구절절인 기분... 😂

profile
공부는 많은 양을 하진 않더라도 꾸준히 매일 하기

0개의 댓글