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