[BaekJoon] 11720번 - 숫자의 합 (java)

1. 문제

👉 문제 바로가기

- 조건

시간 제한 메모리 제한
1초 256MB


- 문제

N개의 숫자가 공백 없이 쓰여있다. 이 숫자를 모두 합해서 출력하는 프로그램을 작성하시오.



- 입력

첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다.



- 출력

입력으로 주어진 숫자 N개의 합을 출력한다.

- 예제

  입력      출력  
1
1
1
5
54321
15
25
7000000000000000000000000
7
11
10987654321
46





2. 풀이


- 알고리즘

for 반복문을 사용해 첫번째 입력 값만큼 반복하여 두번째 입력 값의 모든 자리수의 합을 출력한다.

for (초기식; 조건식; 증감식) {
    조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문 작성;
}





2개의 입력방식을 사용해서 결과를 출력한다.

  1. Scanner 클래스
  2. BufferedReader 클래스


3가지 방법을 사용해서 두 번째로 입력받은 값의 각 자릿수의 합을 구한다.

  1. charAt()
  2. getBytes()
  3. BufferedReader 의 read()




2-1. Scanner 클래스 + charAt()

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        
        int N = sc.nextInt();
        String str = sc.next();
        int sum = 0;
        sc.close();
        
        for(int i = 0; i < N; i++){
            sum += str.charAt(i) - '0';
        }
        System.out.println(sum);
    }
}

위와같이 객체를 생성할 때, Scanner(System.in) 에서 System.in 은 입력한 값을 Byte 단위로 읽는것을 뜻한다.

int 형 데이터를 입력받기 위해 nextInt() 메서드를 사용한다.
String 형 데이터를 입력받기 위해 next() 메서드를 사용한다.

String 클래스의 charAt() 메서드는 문자열 각 자릿수의 값을 구한 후, 해당 문자의 아스키코드 값을 반환한다.
'0' 또는 0 의 아스키코드 48 을 빼서 숫자를 구한다.



[여기서 잠깐!]

Scanner에 대해 더 자세히 알고싶다면 여기 를 클릭하세요




2-2. BufferedReader 클래스 사용

① BufferedReader + getBytes()

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
       
        br.readLine(); //변수에 저장할 필요가 없어서 입력만 받음
        
        int sum = 0;
        
        for(byte value : br.readLine().getBytes()){
            sum += (value - 48);
        }
        System.out.println(sum);
        br.close();
    }
}

확장 for 문
for(타입 변수명 : 배열){ }
배열에 저장된 값을 순서대로 반복한다.

getBytes() 는 readLine() 으로 읽어들인 문자를 byte[] 로 반환한다.
배열에 문자의 값을 저장하기 때문에 ‘0’ 또는 48 을 빼야한다.



[여기서 잠깐!]

BufferedWriter 클래스에 대해 더 알아보고 싶으면 여기를 클릭하면 된다.





② BufferedReader + BufferedReader 의 read()

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int N = Integer.parseInt(br.readLine());
        int sum = 0;
        
        for(int i = 0; i < N; i++){
            sum += br.read() - 48;
        }
        System.out.println(sum);
        br.close();
    }
}

br.read() 는 문자 하나를 읽어 아스키코드 값으로 출력한다.
'0' 또는 0 의 아스키코드 48 을 빼서 숫자를 구한다.
읽을 문자가 없는 경우엔 -1을 반환한다.





3. 성능 비교

image

위에서 부터 순서대로

BufferedReader + getBytes()
BufferedReader + BufferedReader의 read()
Scanner + charAt()

위와같이 입력 메소드와 알고리즘 구현 방법에 따라 시간이 달라질 수 있다.

입력의 경우 확실히 Scanner 보다는 BufferedReader 가 빠른 것을 볼 수 있다.





관련 페이지

Categories:

Updated:

Leave a comment