본문 바로가기
Baekjoon/브론즈 5

[백준][JAVA/자바] 11382번: 꼬마 정민 - while 문 써서 해결하는 방법

by 감자감자곰 2023. 12. 19.

<단계>

브론즈 5


<문제>

 

11382번: 꼬마 정민

첫 번째 줄에 A, B, C (1 ≤ A, B, C ≤ 1012)이 공백을 사이에 두고 주어진다.

www.acmicpc.net


<코드>

 

(1) 간단한 방법 사용

import java.util.Scanner;

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

        long sum = 0;

        Long a = scanner.nextLong();
        Long b = scanner.nextLong();
        Long c = scanner.nextLong();

        sum = a + b + c;

        System.out.println(sum);

    }
}

(2) while 문 사용

// while 문 사용

import java.util.Scanner;

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

        long sum = 0;
        String line = scanner.nextLine();
        Scanner lineScanner = new Scanner(line);

        while (lineScanner.hasNext()) {
            sum += lineScanner.nextLong();
        }

        System.out.println(sum);

    }
}

<트러블 슈팅>

 

(1) scanner의 입력 종료를 파악하지 못하는 코드를 작성했던 문제

// 잘못된 코드

import java.util.Scanner;

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

        int sum = 0;

        while (scanner.hasNextInt()) {
            sum += scanner.nextInt();
        }

        System.out.println(sum);

    }
}

while 문을 사용해 scanner에 입력이 있을 때만 그 값을 sum에 누적해 주면 되겠다고 생각을 해 위와 같이 코드를 작성했다. 하지만 코드를 실행해 '1 2 3'과 같이 입력을 하고 엔터를 쳐도 콘솔창에서 계속 사용자의 입력을 기다리는 문제가 발생했다.

 

scanner의 nextInt()는 스페이스와 엔터 둘 다를 구분자로 인식하기에, 엔터를 입력해도 이를 종료로 받아들이지 않는 것 같다. while 문을 꼭 써서 해결하고 싶다면, '1 2 3'이라는 한 줄을 먼저 입력받고, 그 줄을 while 문을 통해 읽어나가면서 sum 값을 누적해 가는 방법을 사용해야 한다. 이렇게 작성한 코드가 (2)번 코드다.

 

다만 이 코드는 scanner 두 개를 사용해야하는 번거로움이 있다. 그래도 덕분에 scanner의 사용 방법을 좀 더 자세히 알아볼 수 있었다.


(2) 입력값의 크기를 고려하지 않은 코드를 작성했던 문제

 

A, B, C의 값의 최대 크기는 10^12인데, 이는 int 타입의 최댓값을 초과하는 범위라 int 대신 long을 사용해주어야 한다. 문제를 제대로 읽지 않고 코드가 잘 돌아가길래 제출했는데 틀렸다는 문구가 나와 다시 확인해 보니 이를 고려해주지 못했다ㅠㅠ int로 작성된 부분을 다 long으로 고쳐주었더니 정답 처리되었다.

댓글