devnoong.log
article thumbnail
728x90

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

 

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

입출력 예
t p result
"3141592" "271" 2
"500220839878" "7" 8
"10203" "15" 3

입출력 예 설명

입출력 예 #1
본문과 같습니다.

입출력 예 #2
p의 길이가 1이므로 t의 부분문자열은 "5", "0", 0", "2", "2", "0", "8", "3", "9", "8", "7", "8"이며 이중 7보다 작거나 같은 숫자는 "5", "0", "0", "2", "2", "0", "3", "7" 이렇게 8개가 있습니다.

입출력 예 #3
p의 길이가 2이므로 t의 부분문자열은 "10", "02", "20", "03"이며, 이중 15보다 작거나 같은 숫자는 "10", "02", "03" 이렇게 3개입니다. "02"와 "03"은 각각 2, 3에 해당한다는 점에 주의하세요

 

문제 풀이

 

아래의 코드로 제출했을때 테스트 케이스는 통과되었지만, 일부는 런타임 에러로 오류가 발생했다ㅜ

 		
        int numP = Integer.parseInt(p);

        for(int i=0; i<t.length()-p.length()+1; i++){
            int n = Integer.parseInt(t.substring(i,i+p.length()));
            if (n <= numP){
                result++;
            }
        }

 

원인분석

문자열의 최대길이를 int 숫자값과 동일할 것이라고 착각했다ㅜㅜ

 

즉 문자열 p의 최대길이가 18자리이므로, 문자열 길이당 최대숫자는 (10^길이 )- 1이므로

(10^18) -1 = 999999999999999999의 숫자가 나온다...^^

 

종류
설명
저장 공간
값의 범위(최소값~최대값)
int
부호 있는 정수
32 bits
-2,147,483,648 ~ 2,147,483,647
long
부호 있는 정수
64 bits
-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

 

위의 표를 보면 int는 10자리까지 표현이 가능하지만, long 타입의 경우 19자리까지 표현이 가능하다.

 

p의 최대 길이는 10자리가 넘으므로 int 표현이 불가능하니 long으로 표현해주고, 

p의 길이가 t의 최소 길이므로,  t도 long 타입으로 변환시켜준다.

 

  		
        Long numP = Long.parseLong(p);

        for(int i=0; i<t.length()-p.length()+1; i++){
            Long n = Long.parseLong(t.substring(i,i+p.length()));
            if (n <= numP){
                result++;
            }
        }
728x90