알고리즘/문자열

[백준알고리즘] 문자열 - 11720 숫자의 합 문제

Fenderblue 2022. 7. 8. 21:54

문제 자체는 쉽지만 nextLine과 next의 차이가 뭔지,

숫자 문자열을 어떻게 아스키코드 말고 그대로의 숫자로 만들지에 대해 고민했던 문제다.

 

1. Scanner 클래스의 nextLine은 입력을 받을때 버퍼에 남아있는 개행문자를 읽어들이는 반면,

next는 개행문자는 이를 무시한다. 따라서 여러 줄을 입력하고자 할때 nextLine이 문제가 될 여지가 있다.

예를들어 nextInt, nextLine을 연이어 쓴다면 입력할때 콘솔창에 숫자를 입력하고 엔터를 누르는 순간

그 다음줄에 뭔가를 치기도 전에 nextLine이 개행문자를 읽어버려 입력이 끝나게 되어 버리는 것이다.

따라서 연이어 뭔가를 입력하고자 할 때 nextLine을 일부로 한번 넣어 버퍼를 비우고 그 다음에 nextLine을 다시 사용해서

입력시킬수도 있고 또는 next를 사용할수도 있다. (나는 이렇게 했다)

 

2. sum 변수에 input에다 입력받았던 숫자 문자열을 input.charAt()를 사용하여 하나씩 문자로 추출하고 자동형변환시켜

sum에 더하고자 했는데 아스키코드의 수가 나와서 원하던 결과를 얻을 수 없었다.

따라서 Integer.parseint()로 문자를 그대로의 숫자로 변환시키고자 했는데 이건 문자열을 숫자로 변환시켜주는 함수라

오류 표시선이 떴다. 어떻게 원하는 그대로의 숫자를 구할 수 있을까 구글링했다

문자열에서 추출한 문자에서 - '0'을 하고 int형 변수에 저장하면 된다.

각 숫자의 아스키코드는 0을 의미하는 48을 빼면 원래의 그 수가 되는 원리를 이용하는 것이다.

아스키코드에서의 1번~48번을 제외하면 그 다음 순서부터 1번이 되는거니까 1 ->1, 2->2...가 되는것

학교 c++수업에서 배웠었는데 그새 까먹고있었다.

 

package Level6;

import java.util.Scanner;

public class SumNum {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int count = sc.nextInt();
        String input = sc.next();   //next는 개행문자를 건너띄고 입력을 받지만 nextLine은 개행문자까지 받아들인다.
        int sum = 0;
        for (int i = 0; i < count; i++) {
            //sum += Integer.parseInt(input.charAt(i)); //string을 한 문자씩 가져다가 자동형변환해서 더해주기..근데 이렇게하니까 숫자가 아스키코드식으로 나옴
            //Integer.parseInt는 String타입을 int로 바꿔주는거임
            sum += input.charAt(i) - '0';

        }
        System.out.print(sum);

    }
}