[백준] 11720번 : 숫자의 합 - JAVA [자바]
https://www.acmicpc.net/problem/11720
-
문제
매우 간단한 문제다!
※ 주의할 점
- 두 번째로 입력받은 값의 각 자릿수의 합을 구하는 문제다.
- 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
그럼 아래 코드를 보자.
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() 등 문자열을 처리할 때 도움되는 메소드들이 많다. )
'JAVA - 백준 [BAEK JOON] > 문자열' 카테고리의 다른 글
[백준] 1152번 : 단어의 개수 - JAVA [자바] (33) | 2020.03.20 |
---|---|
[백준] 1157번 : 단어 공부 - JAVA [자바] (42) | 2020.03.19 |
[백준] 2675번 : 문자열 반복 - JAVA [자바] (22) | 2020.03.19 |
[백준] 10809번 : 알파벳 찾기 - JAVA [자바] (41) | 2020.03.18 |
[백준] 11654번 : 아스키 코드 - JAVA [자바] (6) | 2020.03.16 |