코딩테스트/알고리즘 문제

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

glorypang 2025. 3. 29. 00:36
728x90
반응형
SMALL

📌 문제 정보

  • 출처: 문제 링크
  • 난이도: ⭐ 
  • 문제 유형: 문자열
  • 사용 언어: Java 

🔍 문제 설명

숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.

예를 들어, t="3141592"이고 p="271" 인 경우, t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.

 

제한사항

  • 1 ≤ p의 길이 ≤ 18
  • p의 길이 ≤ t의 길이 ≤ 10,000
  • t와 p는 숫자로만 이루어진 문자열이며, 0으로 시작하지 않습니다.

💡 풀이 노트

  • `t.substring(i, i + p.length())`: 길이가 `p`와 같은 부분 문자열을 추출
  • `Long.parseLong(...)`: 문자열을 숫자로 변환해 비교
  • `if (Long.parseLong(p) >= Long.parseLong(temp))`: 작거나 같으면 카운트 증가

1. 왜 `Integer.parseInt()`는 안 될까?

  • `Integer.parseInt()`는 최대 10자리(2147483647) 까지 표현 가능
  • 문제에서 `p`는 최대 18자리까지 가능하므로, `int` 범위 초과
  • 이 경우 런타임 에러 (`NumberFormatException`) 발생

2. 해결법

  • `Long.parseLong()` 사용
  • → 최대 18자리의 정수(9,223,372,036,854,775,807)까지 표현 가능

🚀 코드 (Java)

class Solution {
    public int solution(String t, String p) {
        int answer = 0;
        for(int i = 0 ; i< t.length() - p.length()+1; i++){ 
	// p의 길이에 맞게 자른 t의 부분 문자열
            String temp = t.substring(i, i+p.length()); 
            if(Long.parseLong(p) >= Long.parseLong(temp)) answer++;
        }
        return answer;
    }
}

🖥 실행 결과

입력 & 출력
t			p	result
"3141592"		"271"	2
"500220839878"		"7"	8
"10203"			"15"	3

 


🔄String 클래스 메서드

메서드  설명
`length()` 문자열 길이 반환
`charAt(i)` i번째 문자 반환
`substring(a,b)` a 이상 b 미만 부분 문자열
`equals(s)` 문자열 비교 (대소문자 구분)
`equalsIgnoreCase` 문자열 비교 (대소문자 무시)
`contains(s)` 부분 문자열 포함 여부
`indexOf(s)` 특정 문자열 위치 (없으면 -1)
`startsWith(s)` 접두사 확인
`endsWith(s)` 접미사 확인
`replace(a, b)` 문자열 치환
`toUpperCase()` 대문자 변환
`toLowerCase()` 소문자 변환
`split(regex)` 문자열 나누기 (배열 반환)
`trim()` 앞뒤 공백 제거

 


📌 깃허브 코드 저장소: https://github.com/glorypang/CodingTest

 

 

 

728x90
반응형
LIST