[CodingTest] 자릿수 더하기

hye·2023년 2월 6일
0

AlgorithmTest

목록 보기
4/95

📖 Exam

문제 설명

자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.

제한사항

  • N의 범위 : 100,000,000 이하의 자연수

입출력 예

  • 9 + 8 + 7 = 24이므로 24를 return 하면 됩니다.
Nanswer
1236
98724

✍ Answer

import java.util.*;

public class Solution {
    public int solution(int n) {
        int answer = 0;
        
        String strN = Integer.toString(n);
        
        for(int i=0 ; i < strN.length() ; i++){
            answer += Integer.parseInt(strN.substring(i,i+1));    
        }
        
        return answer;
    }
}

💡 Realization

  • 일단 문자 관련 메서드 까먹은게 너무 많았다...
    대충 어떻게 풀어야할지 구조 생각은 바로 떠올랐으나, 프로그램 열어서 한게 아니라 홈페이지에서 바로 풀었기때문에 메서드 작성 방식에 대해 어렴풋한 애들은 그냥 구글링의 도움을 받았다.

0. length, size (길이)

  • length: 배열(arrays)의 길이 (int[], double[], String[])
  • length(): 문자열의 길이 (String, StringBuilder etc)
  • size(): Collection Object 타입의 길이 (ArrayList, Set etc)

1. int to String (형변환)

숫자를 문자열로 리턴
Integer.toString(int 숫자);
String.valueOf(int 숫자);

  • toString(): NullPointerException(NPE)을 발생
  • valueOf: "null"이라는 문자열로 처리

    valueOf는 "null".equals(String 문자열) 형태로 null 체크
    NPE를 방지하기 위해 toString 보다 valueOf 사용을 추천

참고블로그 : https://swjeong.tistory.com/146

2. String to int (형변환)

문자열을 숫자로 리턴
Integer.parseInt(String 문자);
Integer.valueOf(String 문자);

  • parseInt(): 원시데이터인 int 타입을 반환
  • valueOf(): Integer 래퍼(wrapper)객체를 반환

참고블로그 : https://m.blog.naver.com/sthwin/221000179980

3. substring(int beginIndex, int endIndex)

첫 번째 인자값의 위치를 시작으로 두 번째 인자값의 위치까지 포함한 문자열을 리턴

String str = "12345";
str.substring(0,2); // "123"

참고. substring(int index)

index 위치를 포함한 문자열을 리턴

String str = "12345";
str.substring(3); // "45"

참고. charAt(int index)

index 위치의 문자를 char 타입으로 리턴

String str = "12345";
str.charAt(1); // "2"

참고. split(String regex)

regex 기준으로 문자열을 끊어서 배열에 저장
regex = |을 구분자로 하여 여러 기준으로 문자열을 나눌 수 있다.
split(String regex, int limit)
limit = 배열 최대 개수 (배열 개수만큼 문자열을 나눠 배열에 저장)

숫자 형태의 String 에서 int 로 바로 리턴할 때

String str = "12345";
str.charAt("3") - '0'; // '3'

참고블로그 : https://velog.io/@shin_stealer/코딩테스트-준비-String-관련-문제에서-자주쓰이는-함수-정리JAVA

* 다른 해답1 (charAt)

charAt()을 사용하면 내가 푼 방식보다 훨씬 더 간단하게 작성 가능할꺼같다.
일단 내가 푼 방식은 변환 작업이 많아 굉장히 복잡한데,
charAt은 바로 변환도 되고 메서드 사용도 적어 간편하다.

* 다른 해답2 (n%10)

다른 답 보니까 와 이런 생각을... 싶더라. 좀만 더 생각해볼껄. 아쉽

public class Solution {
    public int solution(int n) {
        int answer = 0;
        while(n>10){
            answer+=n%10;
            if(n<10)
                break;
            n=n/10;
        }
        return answer;
    }
}

while(true)보다는 while문안에 조건으로 n<10을 넣었으니
while 조건을 n>10 조건을 넣는게 좋다. (참고로 n>0해도 해결됨)
디버깅 및 값 추적할때 while true같은 건 비추천.
https://school.programmers.co.kr/learn/courses/30/lessons/12931/solution_groups?language=java (위 내용은 사이트 댓글 참고)

  • 위 풀이보다 훨씬 간결하고 명확한 해답
public class Solution {
    public int solution(int n) {
        int answer = 0;
        while(n!=0){
            //num을 10으로 나눈 나머지를 sum에 더한다.
            answer += n%10;
            //num을 10으로 나눈 값을 다시 num에 저장한다.
            n /= 10;
        }
        return answer;
    }
}

* 다른 해답3 (split)

나도 처음부터 split 생각을 했으나 한글자씩 쪼개는 기준을 못잡아서 패스한건데 공백 기준으로 하면 쪼개지는 문자열 보고 당황. 나중에 split 메서드 봐야겠네.

import java.util.*;

public class Solution {
    public int solution(int n) {
        int answer = 0;
        String[] array = String.valueOf(n).split("");
        for(String s : array){
            answer += Integer.parseInt(s);
        }
        return answer;
    }
}

* 다른 생각

어떤 로직이 정답을 도출해낼 때 효율적인가... 고심하는 과정
정답 아시는 분...? 다시 학원 가서 강사님한테 물어보고싶다...ㅠㅠ

profile
Junior Backend Developer

0개의 댓글