[240122] scanner의 nextInt()

전역변주의 DB·2024년 1월 22일
0

하루회고

목록 보기
11/11

글을 쓰는 계기 : 백준 코테 문제를 풀다가, for 문이 끝까지 돌아가지 않아서 문제는 맞췄지만 찜찜한 마음에 파고들었던 코드에 대한 기록

푼 문제 : https://www.acmicpc.net/problem/10950

1. 처음 짠 코드

import java.io.*;
import java.lang.*;
import java.util.Scanner;

/*
로직.
입력 - scanner(숫자값 입력) 
? Scanner를 사용한 이유? 
- Buffered는 Strign 이라서 형변환이 필수이니, scanner 의 nextInt() 를 사용하기 위해서 scanner를 사용함. 

대충 로직
input
for(int i = 1; i <10 ; i++) {
    Sout( input + " * " + i " = " + input*i );
    }
 */


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

        Scanner sc = new Scanner(System.in);

        // 테스트 케이스의 개수 T
        int T = sc.nextInt();
        //System.out.println(T);

        // 테스트 케이스(0부터 테스트 케이스 수만큼 반복)
        // 왜 T 자리에 무슨 수를 넣어도 네번째까지만 반복하지?
        for (int i = 0; i < T ; i++) {
            //for문 돌때마다 A, B 생성 및 저장
            int A = sc.nextInt();
            int B = sc.nextInt();
            
            // 입력 조건 만족하는지 확인
            checkInput(A, B);

            //System.out.println( "A : " + A + "  B : " + B + " i : " + i);
            System.out.println(A+B);
        }

        sc.close();
    }

    // 입력 조건에 맞지 않은 값이 입력되면 프로그램 종료
    public static void checkInput(int A, int B) {
        if ((A < 1 || A > 10) || (B < 1 || B > 10)) {
            System.exit(0);
        }
    }
}

실행 결과

로직은 맞다고 생각하는데, 출력이 제대로 나오지 않으니 답답했다.
혹시나 싶어서 백준에 코드를 제출하니, 정답이라고 인정은 되었지만!!! 나는 굉장히 찜찜했다.. 이유를 알고 싶었다..


찜찜한 이유 파헤치기.


01. 찜찜한 이유

  1. for 문이 끝까지 돌지 않는다.
  2. 입력과 출력의 경계가 이쁘지 않다.. 안구테러 수준이다..
  3. 입력값을 입력하면 출력이 바로 뜬다. 보통은 Enter를 한 번 눌러줘야 출력값이 뜨는데, 내 코드는 17까지 출력되다가 Enter를 눌러줘야 마지막 출력값인 7이 출력되고 코드가 종료된다. .. 왜? Enter를 애매한 곳에서 눌러줘야하지?
  4. T에 5를 대입하는 것 말고도 3, T+1 이렇게 바꿔줘봐도 동일한 현상...

진짜 찜찜하다..

02. 분석해보기.

개 행

혼자서 이래저래 찜찜한 이유까지 분석해보고 친구한테 SOS를 보냈다.
"니는.. 이 코드가.. 어데가 이상한거 같은데.. ?"

"Scanner의 nextInt() 이거 때문인 것 같은데.. "
" 아 근데 이게 또 입력을 하나씩 받고 출력을 하나씩 해줘서 문제 같은데.. 입력을 한꺼번에 받고 출력을 하면 될 것 같은데... "



OK.




아래 코드는 친구가 짠 코드인데,
배열을 사용하고,
for문을 사용해서 입력을 한번에 배열에 저장,
for문을 사용해서 출력을 한번에 출력 하는 코드이다.

import java.io.*;
import java.lang.*;
import java.util.Scanner;

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

        Scanner sc = new Scanner(System.in);

        // 테스트 케이스의 개수 T
        int T = sc.nextInt();
   		
        //길이 T인 배열
        int[] A = new int[T];
        int[] B = new int[T]; 

        // 입력, for문 돌때마다 A, B 생성 및 저장
        for (int i = 0; i < T ; i++) {
          
            A[i] = sc.nextInt();
            B[i] = sc.nextInt();

        }

        //출력
        for(int i=0; i<T; i++){
            System.out.println(A[i]+B[i]);
        }

        sc.close();
    }
}

결과.

  • 출력이 제대로 나왔다. 엔터를 치지 않아도 끝까지 출력이됐다.

  • "입력을 한번에 받고 출력을 한번에 한다"는 접근 방법이 신기했다. 입/출력에 대해서 크게 생각을 안하고 로직을 짰었는데, 입/출력에 대한 관점이 생겼다.

  • 배열을 사용.



그래도 아직까지 찜찜하다. 내 코드는 도대체 왜 그랬던거지?




"동생님, 오늘 코테 문제를 풀다가 이런 일이 있었는데 제 코드 좀 보시렵니까?"

"어허, 어디 보자"

" 개 행 "

참고 : https://gongstudyit.tistory.com/18

" Scanner 의 nextInt( )는 가장 마지막 개행문자(Enter, newline)을 제거하지 않는다. 개행문자(Enter)전까지만 숫자로 입력 받음 "




....



이거구나.

내 코드에서 입력값들이 줄마다 Enter가 되어있어서 입력이 잘들어갔고 그래서 출력이 나왔던 것인데,
입력의 마지막 줄의 B값은 (공백 앞에 있는 A값은 입력이 되고 출력까지 확인함) 입력이 안되던데.. 엔터가 뒤에 없어서 그랬던 거구나...



그렇다면, 입력값 뒤에 공백을 넣어줘볼까?





개행.. 진짜 평소에 쓰지 않는 말인데 코드를 보면서 자주쓰는 단어.. 개행 잊지않겠어~

이 코드가 엄청 어려운 해결방식을 요구하는 문제는 아니었지만, 찜찜한 마음때문에 이러한 과정을 밟아나갔다.

우선 이 게시글이 뿌듯한 이유는


  1. 코드에 문제가 없어서 맞힌 코드임에도 불구하고 스스로 찜찜함을 없애기 위해서 노력했던 점.
  2. 코테 문제를 풀면서 입/출력에 대한 생각을 크게 안했는데, 친구의 코드를 보고 한꺼번에 입/출력하는 방식을 배운 것.
  3. 찜찜함을 없애버린 점.
  4. 기록하기 위해서 안자고 끝까지 글을 마무리한 점.

" 요즘 코테 문제 푸는게 재밌다. "

profile
배운 내용을 기록하는 공간입니다.

0개의 댓글