코테를 하다가 런타임 에러가 발생해 버렸다...흐음~
문제의 코드들을 살펴 보도록하자!~~~
Copy code
class Solution {
public int solution(String t, String p) {
int answer = 0;
int len = p.length();
long numP = Long.parseLong(p);
for (int i = 0; i <= t.length() - len; i++) {
String sub = t.substring(i, i + len);
long numT = Long.parseLong(sub);
if (numT <= numP) {
answer++;
}
}
return answer;
}
}
Copy code
class Solution {
public int solution(String t, String p) {
int answer = 0;
int pValue = Integer.parseInt(p);
int lengthP = p.length();
for (int i = 0; i <= t.length() - lengthP; i++) {
String subStr = t.substring(i, i + lengthP);
int subValue = Integer.parseInt(subStr);
if (subValue <= pValue) {
answer++;
}
}
return answer;
}
}
이 코드에서는 long 데이터 타입을 사용하여 큰 수를 처리한다. long 타입은 int보다 훨씬 큰 범위의 정수 값을 저장할 수 있기 때문에, 큰 수를 포함하는 문자열을 처리할 때 오버플로우의 위험을 크게 줄일 수 있다.
서브스트링의 길이를 문자열 p의 길이에 맞추어 관리한다. 이러한 접근 방식은 t에서 추출한 서브스트링이 항상 p와 동일한 길이를 가진다는 것을 보장한다. 결과적으로, 문자열 분석 시 일관성과 안정성을 확보한다.
반면, 이 코드에서는 int 데이터 타입을 사용한다. int 타입은 상대적으로 제한된 범위의 정수만을 처리할 수 있다. 따라서 큰 수를 포함하는 문자열을 처리할 때 오버플로우가 발생할 수 있다.
p의 길이를 기준으로 서브스트링을 생성하는 방식은 첫 번째 코드와 유사하나, int 타입으로 인한 값의 범위 제한으로 인해 런타임 오류의 위험이 존재한다.
런타임 오류의 주된 원인: 두 번째 코드에서 런타임 오류가 발생하는 주요 원인은 int 데이터 타입의 사용에 있다. t에서 추출한 서브스트링이나 p 자체가 매우 큰 숫자를 나타낼 경우, Integer.parseInt() 메서드는 NumberFormatException 또는 오버플로우로 인한 부정확한 결과를 반환할 수 있다.
해결 방법: 첫 번째 코드에서 채택된 long 데이터 타입의 사용은 이러한 문제를 피하는 효과적인 방법이다. long을 사용함으로써 더 큰 숫자 범위를 안전하게 처리할 수 있으며, 이는 특히 큰 수를 다룰 때 중요하다.
오늘의 학습을 통해 int와 long 데이터 타입 간의 중요한 차이점을 명확히 이해했다!!!!!!흠....오류 좀 덜나게 써야겠다...?