[코딩테스트연습] 코딩테스트 입문 > Lv.0 자릿수 더하기

2024. 3. 7. 11:46코딩 테스트/[프로그래머스] Java

문제 설명


문제 풀이

주어진 숫자의 각 자릿수끼리 더한 값을 출력하는 것이다.

 

1. 숫자를 문자열로 바꾼다.

2. 문자열의 각 문자에 하나씩 접근해서 숫자로 바꾼다.

3. 바뀐 숫자를 모두 더해서 반환한다.

 

아래는 작성한 코드이다.

class Solution {
    public int solution(int n) {
        int answer = 0;
        String num = Integer.toString(n);
        int numLength = num.length();
        int i=0;
        while(numLength>=0){
            answer += Integer.parseInt(num.charAt(i));
            numLength--;
            i++;
        }
        return answer;
    }
}

 

하지만.. 오류가 발생했다!

/Solution.java:8: error: incompatible types: char cannot be converted to String
            answer += Integer.parseInt(num.charAt(i));
                                                 ^
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
1 error
테스트 결과 (~˘▾˘)~
2개 중 0개 성공

 

charAt()을 이용해서 char를 가져왔는데, 정수로 형변환되는 과정에서 발생한 오류이다.

parseInt()란, 문자열을 integer로 변환하는 메소드이다. 

하지만 나는 char를 integer로 바꾸고 싶기 때문에 다른 방법을 사용해야 하는 것이다.

그렇다면 강제형변환을 통해서 interger로 변경하면 될까?


[try2]

class Solution {
    public int solution(int n) {
        int answer = 0;
        String num = Integer.toString(n);
        int numLength = num.length();
        int i=0;
        while(numLength>=0){
            answer += (int)(num.charAt(i));
            numLength--;
            i++;
        }
        return answer;
    }
}
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 4
	at java.base/java.lang.StringLatin1.charAt(StringLatin1.java:48)
	at java.base/java.lang.String.charAt(String.java:711)
	at Solution.solution(Unknown Source)
	at SolutionTest.lambda$main$0(Unknown Source)
	at SolutionTest$SolutionRunner.run(Unknown Source)
	at SolutionTest.main(Unknown Source)
테스트 결과 (~˘▾˘)~
2개 중 0개 성공

 

오.. 이번엔 다른 오류가 발생했다.

charAt() 메소드를 사용하는 부분에서 발생한 것 같아서 수정해보던 중, while문 조건이 잘못된 것이었다..!

"numLength의 값이 0이상일 때"로 한다면, index를 하나 초과하게 되는 문제가 발생했던 것이다.

다음은 이 점을 보완해서 시도해보았다.

 


[try3]

class Solution {
    public int solution(int n) {
        int answer = 0;
        String num = Integer.toString(n);
        int numLength = num.length();
        int i=0;
        System.out.println(numLength);
        while(numLength>0){
            answer += (int)(num.charAt(i));
            System.out.println(answer);
            numLength--;
            i++;
        }
        return answer;
    }
}
테스트 1
입력값 1234
기댓값 10
실행 결과 실행한 결괏값 202이 기댓값 10과 다릅니다.
출력 4
49
99
150
202

 

중간에 answer이 잘 더해지고 있는지 확인해보기 위해서 출력을 해보았는데, 이상한 결과가 출력되었다!

1,2,3,4가 출력되어야 하는데 웬 다른 숫자들이 출력되고 있었다.

이는 char를 강제 형변환으로 변환했을 때 흔히 발생하는 실수였다.

(int)로 형변환을 하게 되면, 해당 char의 아스키코드로 변경된다는 것이다!

그렇기 때문에 다른 방법으로 char를 형변환 해야한다.


[try4]

class Solution {
    public int solution(int n) {
        int answer = 0;
        String num = Integer.toString(n);
        int numLength = num.length();
        int i=0;
        while(numLength>0){
            answer += num.charAt(i) - '0';
            System.out.println(answer);
            numLength--;
            i++;
        }
        return answer;
    }
}
테스트 1
입력값 1234
기댓값 10
실행 결과 테스트를 통과하였습니다.
출력 1
3
6
10

 

이번에는 제대로 출력되는 것을 확인할 수 있다!

char에 숫자 0의 문자('0')를 빼주는 방법을 사용했다.

이는 자동으로 형변환된 char의 아스키코드를 이용하여 원하는 숫자를 얻어내는 방법이다.

숫자 0 부터 9는 아스키코드로 변환했을 때, 48 부터 57의 값을 가진다.

따라서, 원하는 숫자를 갖고 싶다면 48을 빼주면 된다!

만약 문자 1을 숫자 1로 변경하고 싶다면, 문자 1의 아스키코드 값(49)에서 48만큼을 빼준다. 

 

이 원리를 이용해서 문제를 해결할 수 있었다.

 

이번에는 조금 색다르게 while로 풀어봤는데, for문으로도 작성해보았다.

class Solution {
    public int solution(int n) {
        int answer = 0;
        String num = Integer.toString(n);
        for(int i=0; i<num.length(); i++){
            answer += num.charAt(i) - '0';
        }
        
        return answer;
    }
}

역시..for문이 좀 간결하기는 하다..ㅎ


 

다른 사람 풀이를 봤는데 수학적으로도 접근할 수 있었다. (10으로 나눈 몫과 나머지를 이용하는 등 ..)

또, 문자열을 한 글자씩 나눠서 배열에 담은 후, Integer.parseInt()를 사용하기도 하더라! 

다음 문제는 다양한 시도를 해보는 것도 좋을 것 같다.