JAVA - 백준 [BAEK JOON]/문자열

[백준] 11720번 : 숫자의 합 - JAVA [자바]

ST_ 2020. 3. 17. 15:42
728x90

 


https://www.acmicpc.net/problem/11720

 

11720번: 숫자의 합

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

www.acmicpc.net

 






  • 문제



 

 

 


매우 간단한 문제다!



 주의할 점

  1. 두 번째로 입력받은 값의 각 자릿수의 합을 구하는 문제다.

 

 




  • 2가지 풀이 방법을 제시한다.



Scanner 로 입력받아 charAt() 을 사용하여 푸는 방법과

BufferedReader 로 입력받아 getBytes() 을 이용하여 푸는 방법을 제시할 것이다.

 




  • 풀이

 



- 방법 1 

import java.util.Scanner;

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

		int N = in.nextInt();
		String a = in.next();
		in.close();
		
		int sum = 0;
        
		for(int i = 0; i < N; i++) {
			sum += a.charAt(i)-'0';
		}
		System.out.print(sum);
	}
}

 

 


가장 기본적인 방법이라 할 수 있겠다.

 

먼저 숫자의 개수인 N 을 입력받는다.

 

그리고 다음 줄에 숫자를 정수가 아닌 String (문자열)로 입력을 받는다.

그리고 for문을 통해 입력받은 문자열의 첫번째 원소 ( charAt(0) ) 부터 마지막 원소 ( charAt(N) ) 까지 각 원소의 누적 합을 구하면 된다.

이 때, charAt() 은 해당 문자의 아스키코드 값을 반환하므로 반드시 -48 또는 -'0' 을 해주어야 우리가 입력받은 숫자 값 그대로를 사용할 수 있다.

 






 

- 방법 2 

 

 

BufferedReader 을 쓰는 방법이자 배열을 사용하지 않고 하는 방법이다.

 

우리는 문자열을 입력받을 때 해당 문자열을 쉽게 각 자릿값을 반환받을 수 있는 방법이 있다.

바로 getBytes() 이다.

 

이 메소드에 대한 자바 API 의 설명은 다음과 같다.

 

 

이 메소드는 java.lang.string 패키지에 있는 메소드로 따로 import 할 필요 없이 사용할 수 있다.

설명을 하자면 String (문자열) 에 대하여 해당 문자열을 하나의 byte 배열로 변환해주는 메소드다.

 

이 때, 변환되는 방법은 Charset 에서 사용되는 인코딩 방식, 즉 UTF-16 인코딩으로 변경되는 값을 따른다.

 

* UTF-16 (유니코드)의 앞부분은 아스키코드와 호환되기 때문에 영어 문자 및 숫자는 같다. 즉 아스키 코드에서 0 이라는 문자는 48 라는 값이고 이는 UTF-16 에서도 48 이라는 값을 갖는다.

 

만약 이에 대해 궁금하다면 아래 포스팅을 보면 된다.



https://st-lab.tistory.com/41?category=830901

 

JAVA [자바] - 입력 뜯어보기 [Scanner, InputStream, BufferedReader]

이 글을 지금 이 시점에 써야 할까 고민을 많이 했다. 사실 자바를 그냥 다룰 줄만 아는 것에 목표를 둔다면 이 글이 무의미할 수도 있다. 그러나 자바에 대해 조금이라도 관심이 있고 더 배우고 싶은 분들도 있겠..

st-lab.tistory.com

 

 

 

그럼 아래 코드를 보자.

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();	// N 은 쓸모가 없으므로 입력만 받는다.
		
		int sum = 0;
		
		for(byte value : br.readLine().getBytes()) {
			sum += (value - '0');	// 또는 (a-48)
		}
		
		System.out.print(sum);
		
	}
}

 

 

앞서 말했듯이 getBytes() 는 문자열을  byte 배열로 반환한다고 했다.

 

즉, readLine() 으로 읽어들인 문자를 byte[] 로 변환하여 반환되므로 for-each 구문을 통해 문자열의 문자를 하나하나씩 읽어들일 수 있다.

 

이때 말했듯이 UTF-16 인코딩에 맞게 각 문자의 값을 저장하므로 반드시 '0' 또는 48 을 빼주어야 한다.

 

 

 

더보기

 

 

물론 Scanner 로 입력받아 getBytes() 를 써도 된다.

 

getBytes() 는 String 패키지에 있는 메소드로 String 으로 반환된 문자열이라면 어디서든 쓸 수 있다.

만약 Scanner 로 입력받아 풀고 싶다면 아래와 같이 짜면 된다.

 

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {		

		Scanner in = new Scanner(System.in);
		in.nextInt();
		
		int sum = 0;
		
		for(byte value : in.next().getBytes()) {
			sum += (value - '0');
		}
		
		System.out.print(sum);
		
	}
}

 

 

 

 

 

 

 

 




  • 성능



 

위에서 부터 순서대로

 

채점 번호 : 18486736  -  BufferedReader

채점 번호 : 18586727  -  Scanner

 

 

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

 

 

 




  • 정리



이번 문제는 풀이 자체가 어렵지는 않다. 다만 String 패키지의 getBytes() 메소드를 하나 더 알고 갈 수 있었으면 좋겠다.

( 생각보다 쓰일 일이 많기도 하고 그 외에 getChars() 등 문자열을 처리할 때 도움되는 메소드들이 많다. )