[TIL] (230821) 또 다시 돌아온 int형의 범위초과! 생각을 잘 하자!!

Noh Jihyeon·2023년 8월 21일
0

TIL

목록 보기
7/49
post-thumbnail

알고리즘 문제를 풀었다. 예전부터 계속 걸리던 오버플로우 때문에 이젠 문제의 제한사항을 먼저 읽고 자료형을 판단한다.
하지만 여전히 런타임 오류가 발생했다. 그 이유를 알아보자




🔸문제점


https://school.programmers.co.kr/learn/courses/30/lessons/147355

✅ 내 코드



class Solution {
    public int solution(String t, String p) {
        int answer = 0;
        int pInt = Integer.parseInt(p);
        int pLen = p.length();

        for (int i = 0; i <= t.length() - pLen; i++) {
            String subStr = t.substring(i, i + pLen);
            int tInt = Integer.parseInt(subStr);
            
            if (tInt <= pInt) {
                answer++;
            }
        }
        
        return answer;
    }
}


코드 작성 이유 :

  1. 각 자리별로 주어진 p의 자리만큼 끊어서 만든 숫자를 p와 비교해서 같거나 작으면 count++

  2. 숫자 크기값 비교를 위해 int형으로 변환함 (길이 10,000이하)

  3. for문은 p의 길이만큼은 안돌아도 되기 때문에 범위를 (-pLen)으로 설정



👉 결과


결과는 런타임에러!!

🤔 미리 계산이 가능한건 변수로 설정했다고 생각하는데 어떤걸 더 줄일 수 있을까 고민해봤다.




🔸시도해본 것들



제출하기 전에 실행값 테스트에서는 정상이었다.
그리고 오류에는 런타임 오류라고 메세지가 출력되었다.
제한사항의 범위를 보고 int형으로 변경했고, 값도 정상인데 어디에서 오류가 발생한걸까?
일단 미리 계산이 가능한 부분은 변수로 설정하고 다시 제출해봤다.

	int answer = 0;
    Long pNum = Long.parseLong(p);
    int len = t.length() - p.length();
    int pLen = p.length();
        

👉 여전히 제출오류....


사실 지금 변경한 코드도 평소와 다르지 않아서 과연 이것들 말고 어떤 부분이 문제인지 고민해봤다.


문제를 다시 읽어보던중 한가지가 눈에 들어왔다.


내가 봤던 길이는 어떤 자료형의 기준인가?

바로 문자열인 t와 p이다.

여기서 주목할 점은 "문자열"이라는 것이다.

String a = "12346578"; 

여기서 a의 길이는 8이다.
그렇다면 int형의 범위인 -2,147,483,648~ 2,147,483,647의 길이는 몇인가?

"-2,147,483,648"의 길이: 13
"2,147,483,647"의 길이: 12

고작 13, 12개밖에 안된다.

나는 이 범위를 10,000(일만)으로 본 것이었다.

물론 long형으로 p<= t<= 10,000의 범위를 만족시키지 못하지만 지금은 int는 부족, Long형태로는 반환이 가능하니 이 부분을 잘 기억했다가 Long으로도 해결할 수 없는 상황에서 더 큰 정수 자료형이나 문자열로 처리하는 방법을 고려해보자.



🔸해결



정상적으로 통과했다.



🔸알게 된 점


이 문제는 "숫자로 이루어진 문자열"이 핵심이었다.
처음 주어지는 값은 문자열이고 이 값의 대소를 비교해야하니 숫자형태로 풀이를 진행해야 했다.


그동안 int형과 Long형에 당한 뒤로 제한사항을 살펴보긴 했으나, 내 머리위에 있는 코딩테스트는 값의 범위를 "문자열"기준으로 부여했다.


비슷한 유형으로 생각하고 대충 본 내 잘못이 크다.
제한사항의 조건을 살핀건 좋았으나, 그 범위가 어떤 자료형을 기준으로 한 범위인지 한번 더 체크해보자.

profile
꼭꼭 씹어서 소화시키는 맛있는 코딩

0개의 댓글