본문 바로가기
알고리즘/프로그래머스

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

by KDW999 2023. 1. 8.

https://school.programmers.co.kr/learn/courses/30/lessons/147355

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 접근

문자열 t의 첫 글자부터 p의 크기만큼 부분 문자열을 만들어서 p의 크기와 비교한 뒤 작거나 같으면 그 횟수를 출력하는 문제다.

간단하게 p의 크기만큼 반복문을 돌려서 charAt()으로 t의 부분 문자열을 만들고 형변환으로 값을 비교하면 될 거라 생각했다.

근데  웬 걸 런타임 에러가 뜨더라

 

문제의 조건을 다시보면 p의 길이가 1<= p <= 18로 정의 되어있다.

t의 부분 문자열과 p의 문자열을 받을 변수 t_Num과 p_Num을 처음에 int형으로 선언했었는데 int형은 길이가 10이라 에러가 뜬 것 이었다. 

그래서 형 변환된 문자열들을 대입할 변수의 데이터 타입을 Long으로 다시 지정해주었다.

class Solution {
    public int solution(String t, String p) {
        int answer = 0;
        char word;
        
        Long t_Num = 0L; 
        Long p_Num = 0L;
        
        for(int i=0; i<(t.length()-p.length())+1; i++ ) { // t의 길이-p의 길이 +1해야 횟수가 맞다
        	String sum = "";
        	
        for(int j=0; j<p.length(); j++){
            word = t.charAt(i+j); // word에 t의 문자 저장 후 최종적으로 sum에 취합
                                  // i+j로 t의 부분 문자열을 순서대로 만들도록 함
            sum += word;
        }
        t_Num = Long.valueOf(sum);
        p_Num = Long.valueOf(p);
        
        if(t_Num <= p_Num) {
        	answer++;
        }
       }   
        return answer;      
    }
}

 

charAt()메서드로 일일이 문자를 저장하지 않고 substring() 메서드를 사용해서 한 번에 문자열을 자르는 방법도 있다.

class Solution {
    public int solution(String t, String p) {
        int answer = 0;
        
        long t_Num = 0L;
        long p_Num = 0L;
        
        for(int i=0; i<(t.length()-p.length())+1; i++ ) {
        	String sum = "";
        	
            sum = t.substring(i, i+p.length()); // t.substring(0, 3) t의 0, 1, 2번째 문자만 잘라옴, 마지막 숫자의 -1까지라고 보면 된다.  
            
        t_Num = Long.valueOf(sum);
        p_Num = Long.valueOf(p);
        
        if(t_Num <= p_Num) {
        	answer++;
        }
       }
        return answer;
    }
}

댓글