본문 바로가기

건승하고있어요/알고리즘

[합] 받은 숫자 더하기

반응형

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

(출처: https://www.acmicpc.net/problem/11720)

이 문제는 문제를 이해하는 것부터 힘이 들었다. 문제를 이해하지 못하니 문제가 당연히 안풀리지.
공백 없이 한 번에 숫자를 받아서 그 숫자를 다 더하라는데, 나는 포문을 돌려서 하나씩 받았으니 공백과 함께 다 받은 셈.
그래서 계속 틀려서 매우 화가 났다고 한다... 어려운 문제도 아닌데 나만 유별나게 참 오래 걸렸다.
게다가 틀렸을 때 코드는 남들의 10배정도로 길었다. ㅋㅋㅋㅋㅋㅋ 바보

몇개의 숫자를 입력받을지에 대한 N을 입력받은 후, 그 숫자만큼 숫자를 입력받을 때가 문제였다.
입력 받는 N의 크기는 100까지였고, 한 번에 100자리를 입력할 순 없으니까.

데이터 타입 - int형

int타입은 4byte(32bit)로 표현되는 정수값을 저장할 수 있는 데이터 타입.
저장할 수 있는 값의 범위 : -2,147,483,648 ~ 2,147,483,647(-2^31 ~ (2^31-1))

그래서 문자형으로 숫자 자리를 받은 다음에 그 받은 숫자들을 char형으로 나눠서 또 그 나눈 글자들을 숫자화 시켜서 각각 저장해주는 방법을 활용해야 했다. 하앜하앜 

처음엔 또 그걸 생각을 못해서 char배열을 다시 만들고 또 int배열을 만들어서 하나하나 나눠서 포문을 돌리고 또 돌리고 했는데, 그럴 필요 없이 그냥 그 순간순간 글자를 숫자화 해서 더해주면 된다.

 System.out.println("숫자를 한 번에 입력해주세요.");
        A = true;
        String numbers;
        numbers = scan.next();
        while(A) {
            if(numbers.length() != N) {
                System.out.println(N + "개의 숫자를 입력해주세요.");
                numbers = scan.next();
            } else {
                A = false;
            }
        }

예외처리를 하자면 한참 해야할 것 같은데, 숫자를 어떻게 입력하는지에 대한 오류처리만 했다.
위에서 숫자 받는 예외처리를 하고(언제나처럼),
그리고 그 숫자와 갯수정도는 맞추어줘야 할 것 같아서 그냥 그 정도의 예외처리 정도만... 

String->char 변환
String S = "ciel325";
char C = S.charAt(0); -> : c

()안의 숫자는 String S의 글자들의 배열 순서이다. 그러므로 0번째 글자인 c가 char C가 된다.
그런데 이때, char를 int로 바로 바꾸는 조오오오오은 방법이 있다.

int A = S.charAt(4)-'0'; : 3
이 때 char는 아스키코드값으로 나오는데, 3에대한 아스키코드값은 51, 0에대한 아스키코드값은 48이다. 따라서 63-60은 3이 나온다.
int B = S.charAt(0)-'0'; 의 경우를 보자면
소문자 c의 아스키코드값은 99, 0의 아스키코드값은 48, 99-48=51. 출력을 해보면 51이 나온다.

이렇게! 

아스키코드 (출처: http://littletrue.egloos.com/m/4781098)

그리고 나서는 그냥 스트링으로 받은 애들을 숫자로 다 바꿔준 다음에 포문으로 그때그때 더해줬다.

  int sum=0;
        for(int i=0 ; i<N ; i++) {
            sum = sum + numbers.charAt(i)-'0';
        }
        
        System.out.println(sum);

더해줄 값으로 sum을 선언해주고 거기에 하나하나 그냥 더해줬다.

앞서서 풀 때는 char를 int로 또 변형해줘야 할거 같아서 배열 선언을 해서 char배열에 우선 다 하나하나 넣고, 또 int배열 선언해서 하나하나 넣어준 다음에 그걸 또 포문 돌려서 다 더해주느라.. 남들보다 열배로 긴 코드가 완성된 것이었다었다었다!! 흑흑

저 세줄이면 끝날 코드였는데...ㅋㅋㅋㅋㅋㅋㅋㅋ

그 어떤것보다 쉬운 문제였는데,

1) 문제를 이해못함
2) 데이터형 int 타입에 대한 이해 부족
3) String, char 활용에 대한 이해도 부족
4) 그냥 아는게 없어서 못푼거나 마찬가지

어쨌거나 많이 배워서 다행.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class Sum {
 
    public static void main(String arg[]) {
 
        Scanner scan = new Scanner(System.in);
        System.out.println("몇개의 숫자를 입력할 것인지 숫자를 넣어주세요. (1~100)");
        int N = scan.nextInt();
        boolean A = true;

        while (A) {
            if (N < 1 || N > 100) {
                System.out.println("다시 입력해주세요");
                N = scan.nextInt();
            } else {
                A = false;
            }
        }
        
        System.out.println("숫자를 한 번에 입력해주세요.");
        A = true;
        String numbers;
        numbers = scan.next();
        while(A) {
            if(numbers.length() != N) {
                System.out.println(N + "개의 숫자를 입력해주세요.");
                numbers = scan.next();
            } else {
                A = false;
            }
        }
        
        int sum=0;
        for(int i=0 ; i<N ; i++) {
            sum = sum + numbers.charAt(i)-'0';
        }
        
        System.out.println(sum);
 
        scan.close();
    }
}
cs


반응형

'건승하고있어요 > 알고리즘' 카테고리의 다른 글

[별찍기] 별찍기3  (0) 2018.01.28
[나누기] A/B 출력하기  (0) 2018.01.28
[for문] n의 합  (0) 2018.01.28
[별찍기] 요리조리 별찍기  (0) 2018.01.28
[별찍기] 세상 쉬운 별찍기(인데 나는 못함)  (0) 2018.01.28