숫자로 이루어진 문자열
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 |
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()을 사용해 붙여 준다
💡 이후,
str
과p
에 들어 있는 문자열을 long 타입으로 바꿔 준 후 비교해p
의 수가 더 크다면 answer을 +1 하게 해 준다 (p
의 길이의 제한 때문에 int형을 사용하면 런타임 에러가 발생해 long 타입으로 캐스팅해 문제를 풀게 되었다
문제를 다 푼 후에 다른 분들의 코드를 몇 가지 보게 되었는데... 나는 코드를 효율적으로 짜는 방법을 많이 연습해야겠다는 생각이 들었다 내 코드만 너무 구구절절인 기분... 😂