프로그래머스-문자열 정수의 합-181849

이월(0216tw)·2024년 4월 21일
0

출처: 프로그래머스 코딩 테스트 연습
https://school.programmers.co.kr/learn/courses/30/lessons/181849#

*본 게시물은 비상업적,비영리적 용도로 작성하였습니다.

문제 : 문자열 정수의 합

이 문제는 한 자리의 정수로 이루어진 문자열이 주어졌을 경우 각 자리수의 합을 리턴하는 문제이다.

예) "12345" -> 각 자리의 총합 : 15
조건) 문자열의 길이는 최소 3~ 최대 100 이다.

잘못된 코드 예시)

문자를 정수형으로 변환하고 % (나머지) 와 / (나누기) 를 활용해보자!

class Solution {
    public int solution(String num_str) {
        
        int sum = 0; 
        int num = Integer.parseInt(num_str);  //runtime error!!
        
        
        //로직 예시 
        //12345를 %10 하면 나머지는 5 
        //12345를 /10 하면 1234
        //나눈 num 이 0이면 멈춤
        while(num != 0) { 
            sum += num % 10; 
            num = (int)(num / 10);             
        }
        return sum; 
    }
}코드를 입력하세요

위 코드는 Runtime error 가 발생한다.
int자료형은 최대 2,147,483,647 총 10자리까지 표현 가능하다.
long자료형은 최대 9,223,372,036,854,775,807 총 19자리까지 표현 가능하다.

따라서 입력받은 num_str 이 20자리가 되는 순간 int 이든 long이든
런타임 에러가 발생하는 것이다.

해결 소스 방안1)

문자열을 문자 배열로 변환하여 각 int 처리하기

class Solution {
    public int solution(String num_str) {

		//문자열을 문자배열로 변환
        char[] numStrToCharArray = num_str.toCharArray();
        int sum = 0; 

        for(int i = 0 ; i<numStrToCharArray.length; i++) {
                   //getNumericValue : char를 int형으로 변환한다.
            sum += Character.getNumericValue(numStrToCharArray[i]);
        }

        return sum; 
    }
}

해결 소스 방안2)

BigInteger 클래스를 활용해서 큰 수를 처리하기


import java.math.BigInteger;

class Solution {
    public int solution(String num_str) {

        BigInteger numBigInteger = new BigInteger(num_str);         
        BigInteger sum = new BigInteger("0"); 
        BigInteger divider = new BigInteger("10"); 

        while (numBigInteger.intValue() != 0) {
            
            //BigInteger는 불변클래스이므로 add메서드로 값을 변경하는게 아니라
            //add처리를 한 새로운 결과인 BigInteger를 반환해야 한다.
            sum = sum.add( numBigInteger.remainder(divider)); 
            numBigInteger = numBigInteger.divide(divider); 
        }
       
        return sum.intValue(); 
    }
} 

해결 소스 방안3) - 다른 개발자의 풀이

numStr.chars().map(c -> c - 48).sum(); //쩐..쩐다..!

위 방식을 풀이해보면
String.chars() 가 문자열을 이루는 문자들을 IntStream으로 변환을 한다.
이 때 변환되는 값은 유니코드 값이다. 예) '1' 은 유니코드로 49 , '2'는 50
map() 을 이용해서 각 값을 재처리한다. 예) 49 -> 49-48 : 1, 50 -> 50-48 : 2
마지막으로 sum() 을 이용해서 값을 더했다.
이 부분을 보고 Stream을 더 공부해보면 재밌겠다는 생각이 든다.

<정리>
1. int 나 long 은 20자리가 넘는 문자열은 숫자로 담을 수 없다.
2. 따라서 개별 char배열로 만들거나, BigInteger를 활용해 문제를 풀이함으로써
숫자크기에 대한 문제를 해결 할 수 있었다.
3. Stream을 활용하면 더 쉽고 간결한 코드가 가능하니까 더 공부해봐야겠다.

profile
Backend Developer (Financial)

0개의 댓글