[배열과 리스트] 숫자의 합 구하기

2024. 7. 16. 15:49WebBack/알고리즘

백준ㅣ11720번

 

더보기

1단계

 

문제 분석)

 

위 문제는 배열과 리스트 중에 어느 것이 적합할까?

-> 배열이 더 적합하다. 그 이유는 다음과 같다.

1. 첫째 줄 입력을 통해 배열의 크기를 알 수 있다. (크기 고정) 

2. 배열에 있는 데이터에 모두 접근을 해야한다. (접근 빠름)

 

숫자 입력은 어떤 타입으로 지정해야할까?

-> 100자리까지 입력을 받는다. int는 약 10자리, long은 약 19자리를 저장할 수 있다. 100자리의 숫자를 넣으면 오버플로우가 발생한다(p.62). 더 많은 숫자를 담을 수 있는 String 타입을 사용할 필요가 있다. 

 

-참조: <<자바의 정석 기초편>>, p.53

 

String의 값을 어떻게 더해야할까?

-> String 타입으로 받은 뒤에 각 자리 숫자를 char로 전환하여 하나씩 더하면 된다. 다만, char을 각각 더하기 위해 int로 형변환을 하면 문자코드로 전환된다. '0'이 48, '1'이 49 ... '9'는 57이다. 이를 해결하기 위해서는 '0'을 빼면 된다. (p.66)

 

-참조:<<기초편>>, p.88 

더보기

2단계

 

구조 짜기)

 

1. 첫번째 입력값을 받는다. (int inputA)

2. 두번째 입력값을 받는다. (String inputB)

3. 모든 값을 더할 변수를 만든다. (int total)

4. inputA값의 크기를 가진 int[] intArr을 만들어 초기화한다. 

5. for문을 통해 charAt을 통해 String의 각 자리 숫자를 char로 변환한다. (복잡도 O(n))

6. 그 과정에서 char에 '0'을 빼서 int로 전환한다. 

7. 그 과정에서 그 값을 charArr에 넣는다. 

8. for문을 이용해 배열의 각 값을 total에 저장한다. ( 복잡도 O(n) )

9. total값을 출력한다. 

 

==> 총  복잡도 O(n)

//3단계 코드짜기

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    System.out.print("자릿수를 입력하세요)");
    int inputA = sc.nextInt();

    System.out.print("값을 입력하세요)");
    String inputB = sc.nextLine(); //2번

    int[] intArr = new int[inputA]; //3번

    int total = 0;//4번

    for(int i = 0; i < intArr.length; i++){
      intArr[i] = (int)(inputB.charAt(i) - '0'); //5번 //6번 //7번
    }

    for(int i = 0; i < intArr.length; i++){
      total += intArr[i]; //8번
    }

    System.out.println("모든 숫자의 합)" + total); //9번
    sc.close();
  }

 

더보기

4단계

 

문제 점검)

 

inputA를 입력하는데 아래와 같은 오류가 발생하였다. 입력을 하지 않았는데 왜 값 입력이 문제가 있다고 오류를 보낼까? 고민하다가 혹시 자릿수에 입력한 값이 그대로 값이 남아있어서 그런 것이 아닌가 생각했다. 예전에 비슷한 오류를 겪어서 해결한 기억이 떠올랐다. 

 

이를 위해 코드 중간에

sc.nextLine();

 

초기화 코드를 넣어주니 해결되었다. 

 

import java.util.Scanner;

class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    int inputA = sc.nextInt();

    sc.nextLine(); //입력값 초기화

    String inputB = sc.nextLine(); //2번

    int[] intArr = new int[inputA]; //3번

    int total = 0;//4번

    for(int i = 0; i < intArr.length; i++){
      intArr[i] = (int)(inputB.charAt(i) - '0'); //5번 //6번 //7번
    }

    for(int i = 0; i < intArr.length; i++){
      total += intArr[i]; //8번
    }

    System.out.println(total); //9번
    sc.close();
  }
}

 

해결!!!

 

//5단계 다른 코드 참고

class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int N = sc.nextInt();

    String sNum = sc.next();
    char[] cNum = sNum.toCharArray();
    int sum = 0;
    for (int i = 0; i < cNum.length; i++) {
      sum += cNum[i] - '0';
    }
    System.out.println(sum);
  }
}

 

배열을 만드는 과정을 toCharArray()를 통해 해결하여 for문을 하나 줄였다. 참고할만하다.