3 분 소요

👉 백준 입출력과 사칙연산 https://www.acmicpc.net/step/1


백준 단계별로 풀어보기 1단계 - 입출력과 사칙연산(1-5)입니다.

새로운 언어를 공부할 때 이걸 풀면서 시작해도 정말 좋습니다!

저는 백준으로 자바를 시작했어요


1. Hello World (2557번)

image-20230928132231122

https://www.acmicpc.net/problem/2557

정말 기본적인 문제이다🐣

Hello World!” 를 그대로 출력 해주기만 하면 된다 :)


Java

public class Main {
  public static void main(String[] args) {
      System.out.println("Hello World!");
  }
}

쉽쥬?


2. A+B (1000번)

image-20230928134008195

https://www.acmicpc.net/problem/1000

정수 AB입력받아서 두 수를 더한 값출력하는 문제다.

입력을 받는 방법으로는 Scanner를 이용하거나,

BufferedReaderStringTokenizer를 이용하는 방법이 있다.

먼저 Scanner로 풀어보겠다.


Java (Scanner)

//Scanner 클래스를 사용하기 위해 호출
import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in); //Scanner 객체 생성
    //입력
    int A = sc.nextInt();
    int B = sc.nextInt();
    //출력
    System.out.println(A+B);
  }
}

Scanner 클래스를 사용하기 위해서는 util 패키지 내에 있는 Scanner 클래스를 호출해 주어야 한다.

Scanner는 여러 값을 입력받을 때 토큰(공백, 탭, 엔터)으로 구분하여 입력받는다.

Scanner 클래스의 nextInt() 메소드는 int형을 입력받아 리턴해준다. (nextLong, nextDouble, nextLine 등등… 다양한 메소드가 있다.)

그리고 마지막에 출력할 때 더해주기만 하면 된다!

간단하쥬?

이번에는 조금 더 빠른 방법을 써보겠습니다 🏃‍♂️🏃‍♂️🏃‍♂️


Java (BufferedReader + StringTokenizer)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class Main {
  public static void main(String[] args) throws IOException {
    //클래스 객체 생성
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine());
    //입력
    int A = Integer.parseInt(st.nextToken());
    int B = Integer.parseInt(st.nextToken());
    //출력
    System.out.println(A+B);
  }
}

아까보다 코드가 조금 더 복잡해졌다.

우선 클래스들을 사용하기 위해 호출을 한다. (BufferedReader, InputStreamReader, IOException, StringTokenizer)

객체를 생성하는 코드를 정말 간단하게 설명하면

System.in(byte입력받음) ➡ InputStreamReader(char변환) ➡ BufferedReader(버퍼에 저장 후 문자열로 내보내기)

StringTokenizer 메소드 : StringTokenizer(문자열, “구분자(없으면 공백이 기본값)”)

간단하게 설명하면 이렇습니다…🤔 나중에 이거 설명하는 글도 올릴게요 :)

-

변수 A,B에 넣을 때는 입력받은 값이 문자열로 나오기 때문에 parseInt를 통해서 int형 변환을 시켜줘야 한다 !

그리고 똑같이 더한 값을 출력하면 끝 !!

fast

제출번호 67304224 - BufferedReader + StringTokenizer이용 (128ms)

제출번호 67283959 - Scanner 이용 (208ms)

images

아니 정말 빠르잖아..!!

위의 결과처럼 실제로 BufferedReader + StringTokenizer를 쓴 것이 훨씬 빠르다는 것을 알 수 있다.

지금은 속도가 크게 상관은 없지만 나중에 시간 제한이 있는 문제들도 나오기 때문에 빠른 방법도 알아두는 것이 좋다!


2-1 BufferedReader 가 왜 빠를까….?

추석 기념으로 차가 밀리는 것으로 예를 들어보자🚗🚙🚌

Screenshot_20230928_231906_Samsung Notes

차들이 입력받은 문자(A,B,C,D)라고 생각하자

요금을 정산할 때 차 한대씩 정산하는 것보다, 하이패스로 한 번에 하는 것이 훨씬 빠르다.

한 대씩 정산하는 것이 Scanner이고,

하이패스가 BufferedReader라고 생각하면 이해가 쉬울 것이다.

간단히 말하면 Scanner는 출력할 때 입력받은 값을 하나씩 내보내는 반면,

BufferedReader는 입력받은 값들을 한 번에 내보낸다.

그래서 Scanner보다 BufferedReader가 훨씬 빠른 것이다 !!

나중에 다른 글로 더 자세히 다뤄보겠습니다


3. A-B (1001번)

image-20230928233431115

https://www.acmicpc.net/problem/1001

위 문제에서 연산자만 -로 바꾸면 된다.


Java (Scanner)

import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
      
    int A = sc.nextInt();
    int B = sc.nextInt();
      
    System.out.println(A-B);
  }
}

Java (BufferedReader + StringTokenizer)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine());

    int A = Integer.parseInt(st.nextToken());
    int B = Integer.parseInt(st.nextToken());

    System.out.println(A-B);
  }
}

image-20230928234545237

제출번호 67307209 - BufferedReader + StringTokenizer

제출번호 67307202 - Scanner

역시 BufferedReader가 빠르다


4. AxB (10998번)

image-20230928234802544

https://www.acmicpc.net/problem/10998

연산자를 *(곱셈)으로 바꾸자!


Java (Scanner)

import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
      
    int A = sc.nextInt();
    int B = sc.nextInt();
      
    System.out.println(A*B);
  }
}

Java (BufferedReader + StringTokenizer)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine());

    int A = Integer.parseInt(st.nextToken());
    int B = Integer.parseInt(st.nextToken());

    System.out.println(A*B);
  }
}

5. A/B (1008번)

image-20230928235128309

https://www.acmicpc.net/problem/1008

이번 문제는 연산자만 바꾼다고 해결되지 않는다 !!!

출력 값이 소수점 아래까지 나오기 때문에 변수를 저장할 때 double형으로 저장해야 한다.

이처럼 백준 문제를 풀 때는 입출력 값을 잘 봐야 한다… 안 그러면 오류 난다. (맞는데 왜 틀리지…?????)


Java (Scanner)

import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
      
    double A = sc.nextInt();
    double B = sc.nextInt();
      
    System.out.println(A/B);
  }
}

Java (BufferedReader + StringTokenizer)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine());

    double A = Integer.parseInt(st.nextToken());
    double B = Integer.parseInt(st.nextToken());

    System.out.println(A/B);
  }
}

입력값이 실수가 아니기 때문에 parseInt까지 건드릴 필요는 없다.


nothingtodo

오늘은 여기까지만 쓰도록 하겠습니다 !

다들 즐거운 추석 보내세요 ☺☺

🔥연휴에도 열심히🔥

댓글남기기