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

Lee·2023년 4월 5일
0

알고리즘

목록 보기
9/34
post-thumbnail

문제 출처

문제 출처 : 이상한 문자 만들기

문제 이해하기

  • 숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p의 길이와 같은 부분 문자열을 만든 후, p보다 작거나 같은지 판별하고 그 횟수를 출력해주면 된다.

주요 조건 이해하기 ⭐️

문제에 주어진 입출력 단어를 위 문제를 이해해 보면

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;
    }
}

0개의 댓글