문제 출처 : 이상한 문자 만들기
문제에 주어진 입출력 단어를 위 문제를 이해해 보면
t = "314592" p = "271" 일 때, p의 길이가 3이므로 t에선 길이가 3인 부분 문자열을 최대한 만들어야 한다.
길이가 3인 t의 부분 문자열 : "314", "141", "415", "159", "592"
유심히 살펴보면 아래와 같이 자릿수가 하나씩 밀려나가면서 길이가 3인 부분 문자열을 만드는 것을 알 수 있다.
314
141
415
159
592
이러한 내용을 바탕으로 아래와 같은 순서로 코드를 작성하였다.
1. 2중 for문을 돌린다.
2. 바깥쪽 for문은 하나의 자릿수만 접근하고 반복 횟수는 t의 길이 - p의 길이
만큼 반복한다.
3. 안쪽 for문에서 바깥쪽 for문의 인덱스부터 해당 인덱스의 길이 + p의 길이
만큼 반복한다.
4. 순차적으로 문자를 만든 후, list에 대입한 후, 바깥쪽 for문이 종료되기 전에 만들었던 문자를 초기화 시킨다.
5. 리스트를 순회하면서 p보다 작거나 같은지 비교한 후 횟수를 출력한다.
이렇게 작성했더니, 실패하는 코드가 나왔다.
public class SmallSubstring {
public int solution(String t, String p) {
int answer = 0;
StringBuilder sb = new StringBuilder();
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i <= t.length() - p.length(); i++) {
for (int j = i; j < i + p.length(); j++) {
sb.append(t.charAt(j));
}
list.add(Integer.parseInt(sb.toString()));
sb.delete(0, sb.length());
}
for (int i = 0; i < list.size(); i++) {
if (Integer.parseInt(p) >= list.get(i)) {
answer++;
}
}
return answer;
}
public static void main(String[] args) {
new SmallSubstring().solution("3141592", "271");
}
}
그 이유는 제한사항을 보면 숫자의 범위가 아닌 문자열의 길이가 10,000까지이기 때문에 t는 long타입으로 해야하고, p의 최대길이가 t의 길이이기 때문에 p도 int타입 범위를 넘어갈 수 있기 때문이다.
비교연산하는 구간에서만 Long 타입으로 변환시킨 후 다시 돌려보니 통과했다 ⭐️
import java.util.ArrayList;
class Solution {
public int solution(String t, String p) {
int answer = 0;
StringBuilder sb = new StringBuilder();
ArrayList<String> list = new ArrayList<>();
for (int i = 0; i <= t.length() - p.length(); i++) {
for (int j = i; j < i + p.length(); j++) {
sb.append(t.charAt(j));
}
list.add(sb.toString());
sb.delete(0, sb.length());
}
for (String s : list) {
if (Long.parseLong(p) >= Long.parseLong(s)) {
answer++;
}
}
return answer;
}
}