Algorithms/프로그래머스

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

hyunki.Dev 2023. 1. 21. 23:59

 

문제 

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

 

프로그래머스

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

programmers.co.kr

 

풀이

  1. String p 의 길이 length_p 를 저장
  2. 문자열 t 에서 len 만큼 잘라서 long 타입으로 저장 (int 는 값이 작아 오류 발생)
    ❗️for문으로 순회하면서 substring ➡️ 인덱스 넘어가지 않도록 주의
  3. String p를 Long 타입으로 변환  후, 작거나 같으면 answer 값 증가

 

코드 

import java.util.ArrayList;
import java.util.List;

class Solution {
    public int solution(String t, String p) {
        int answer = 0;
	
        // 문자열 p의 길이
        int length_p = p.length();
        
        // 문자열 t의 길이
        int length_t = t.length();
        
        int lengthList = length_t - length_p; // 마지막 substring 첫 인덱스
    
        // substring으로 문자열을 자르고 for 반복문을 돌며 비교
        for (int i = 0; i <= lengthList; i++) {
             if(Long.parseLong(t.substring(i, i + length_p)) <= Long.parseLong(p)){
              answer += 1;
            } 
        }

        return answer;
    }
}

 

다른 사람의 풀이

프로그래머스의 다른 사람 풀이 중 Stream을 사용한 것이 있어서 가져와 보았습니다. 실무에서는 시니어 개발자분들이 for문보다 Stream을 활용할 것을 권장하시는 편입니다. 

import java.util.stream.LongStream;

class Solution {
    public int solution(String t, String p) {
        long targetNumber = Long.parseLong(p);
        int targetNumberLength = p.length();

        return (int) LongStream.range(0L, t.length() - targetNumberLength + 1L)
                .mapToObj(i -> t.substring((int) i, (int) i + targetNumberLength))
                .mapToLong(Long::parseLong)
                .filter(number -> number <= targetNumber)
                .count();
    }
}