개발 쥬스

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

알고리즘

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

DevJuice 2024. 11. 21. 17:00
반응형

🔗 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/147355

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

🔍  해결 과정

문자열 p의 길이만큼 문자열 t의 부분 문자열을 만든 후, p의 값보다 작거나 같은 값에 해당하는 문자열들의 개수를 반환해야 합니다.

 

여기서 p의 최대 길이는 18이므로 Java 기준 Integer의 범위(최대 정수값 2,147,483,647)를 넘어갑니다. (단, 최댓 정수값 9,223,372,036,854,775,807의 값을 가진 Long 범위 안에는 들어옵니다.)

 

 

그래서 문자열 t에서 p의 길이만큼 자른 다음 p와 비교하므로 Long 자료형의 정숫값으로 바꿔준 다음에 두 정수를 비교해도 되지만, 저는  두 문자열 자체로 값을 하나씩 비교함으로써 대소 비교를 하는 방식으로 해결했습니다.


✏️ 코드

class Solution {
    public int solution(String t, String p) {
        int answer = 0;
        int p_len = p.length();
        int t_len = t.length();
        
        // 부분 문자열 중 p보다 작거나 같은 수의 개수를 구하기
        for (int i = 0; i <= t_len - p_len; ++i) {
            String sub = t.substring(i, i + p_len);
            
            if (isLower(sub, p)) {// p보다 작거나 같은지 확인
                ++answer;
            }
        }
        
        return answer;
    }
    
    private boolean isLower(String sub, String p) {
        int sub_len = sub.length();
        int p_len = p.length();
        
        if (sub_len > p_len) { // 길이가 작으면 작은것임
            return false;
        } else if (sub_len < p_len) { // 길이 크면 큰 것임
            return true;
        }
        
        for (int i = 0; i < sub_len; ++i) {
            if (sub.charAt(i) < p.charAt(i)) {
                return true;
            } else if (sub.charAt(i) > p.charAt(i)) {
                return false;
            }
        }
        
        return true;
    }
}
반응형