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

Benjamin·2023년 8월 22일

프로그래머스

목록 보기
52/67

🙋🏻‍♀️ 문자열

Troubleshooting

import java.util.*;
import java.io.*;

class Solution {
    public int solution(String t, String p) {
        int answer = 0;
        List<String> partList = getPartArrayAboutP(t, p);
        
        for(int i=0; i<partList.size(); i++) {
            if(isSmallerOrEqualThanP(partList.get(i), p)) answer++;
        }
        return answer;
    }
    
    public List<String> getPartArrayAboutP(String t, String p) {
        List<String> partList = new ArrayList<>();
        int lenOfP = p.length();
        
        for(int i=0; i<t.length()-lenOfP+1; i++) {
            partList.add(t.substring(i,i+lenOfP));
        }
        return partList;
    }
    
    public Boolean isSmallerOrEqualThanP(String part, String p) {
        if(Integer.parseInt(part) <= Integer.parseInt(p)) {
            return true;
        }
        return false;
    }
}

문제

공개된 테스트 케이스는 다 통과했는데, 제출해보니 일부 히든 테스트 케이스에서 런타임 에러가 발생했다.

원인

원인이 잘 파악되지 않았다.
'질문하기'를 통해 힌트를 얻은 결과, 범위문제라고하더라..
그래서 주어진 제한사항을 다시 잘 살펴보니, p와 t의 숫자범위가 주어진게아니라, 길이가 주어졌다!
잘 생각해보면 p의 길이 <= 18만 해도 int 범위를 넘어간다.
(int의 최대 최소는 10자리, Long은 19자리까지 가능하다.)

해결

Integer.parseInt를 사용해서 타입 변환하는 부분은 Long.parseLong을 사용하도록 수정했다.

제출코드

import java.util.*;
import java.io.*;

class Solution {
    public int solution(String t, String p) {
        int answer = 0;
        List<String> partList = getPartArrayAboutP(t, p);
    
        
        for(int i=0; i<partList.size(); i++) {
            if(isSmallerOrEqualThanP(partList.get(i), p)) answer++;
        }
        return answer;
    }
    
    public List<String> getPartArrayAboutP(String t, String p) {
        List<String> partList = new ArrayList<>();
        int lenOfP = p.length();
        
        for(int i=0; i<t.length()-lenOfP+1; i++) {
            partList.add(t.substring(i,i+lenOfP));
        }
        return partList;
    }
    
    public Boolean isSmallerOrEqualThanP(String part, String p) {
        if(Long.parseLong(part) <= Long.parseLong(p)) {
            return true;
        }
        return false;
    }
}

코드 개선

문제의 난이도에 비해 코드가 너무 긴 것 같아서, 다른 사람들의 코드를 구경했다.
내가 너무 메소드마다 하나의 역할을 부여하는 것에 몰두해서 사용하지 않아도 되는 메모리까지 사용하며 구현했던것같다.

class Solution {
    public int solution(String t, String p) {
        int answer = 0;
        long ip = Long.parseLong(p);

        for(int i=0;i<=t.length()-p.length();i++){
            if(Long.parseLong(t.substring(i,i+p.length()))<=ip){
                answer++;
            }
        }

        return answer;
    }
}
  • 어차피 p는 고정으로 사용하는만큼 처음부터 숫자타입으로 바꿔서 사용하고,
  • t에서 부분 문자열을 구하는것도 사용할 곳이 숫자 크기 비교밖에 없으므로, substring한 것을 굳이 List를 만들어 넣지말고, substring 하자마자 바로바로 비교하는데에 피연산자로 사용하면

훨씬 간단한 코드를 볼 수 있다.

0개의 댓글