ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준, 1008번] 5단계) A/B - JAVA 풀이
    Algorithm&BAEKJOON(백준)/1단계) 입출력과 사칙연산 2023. 4. 13. 18:15
    728x90

     


     

    백준 [1008번] - A/B

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

     

    1008번: A/B

    두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.

    www.acmicpc.net

     


     

    # 문제 해설 

     

    A/B [1008]

     

    A와 B를 입력받아 A/B를 하여 결과를 내는 것이 목표.

    이전 3단계 문제에서 '연산 기호'를 변경해야 한다.  ( / )

     

    (기본적으로 1단계에서는 연산 기호(연산자, Operator)에 대한 이해만 있다면 쉽게 해결할 수 있다.)

     

    * Java 연산자(Operator)?

    더보기

    - Operator 

    : 프로그램 내에서 데이터를 처리해 결과를 도출하는 것을 연산(Operation)이라 하고, 

      이러한 연산에 사용되는 기호를 연산자(Operator)라고 한다. (연산되는 데이터는 피연산자(Operand)라 한다.)

     

    연산자는 ① 증감 연산자(increment and decrement operator), ② 산술 연산자(arithmetic operator), ③ 시프트 연산자(shift operator), ④ 비교 연산자(comparison operator), ⑤ 비트 연산자(bit operator), ⑥ 논리 연산자(logical operator), ⑦ 조건(삼항) 연산자(ternary operator), ⑧ 대입 연산자(aassignment operator)가 있으며, 

    우선 순위 또한 ① > ② > ③ > ④ > ⑤ > ⑥ > ⑦ > ⑧ 순서이다. (특수한 경우를 제외하고)

     

     

    이때, 해당 1단계) 입출력계산 에서는'② 산술 연산자(arithmetic operator)'를 활용하므로, 이에 해당하는 종류를 살펴보겠다.

    + 왼쪽의 피연산자에 오른쪽의 피연산자를 더함. ( A + B , A에 B를 더함 )
    - 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺌. ( A - B, A에 B를 뺌 )
    * 왼쪽의 피연산자에 오른쪽의 피연산자를 곱함. ( A * B, A에 B를 곱함 )
    / 왼쪽의 피연산자를 오른쪽의 피연산자로 나눔. ( A / B, A에 B를 나눔 )
    % 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 나머지를 반환함. ( A % B, A에 B를 나누고 남은 나머지 반환 )

     

    [ 참고 및 추가 자료 : TCP SCOOL - 연산자(operator) ]

     

     

    추가로 이번 문제에는 출력 조건에 '상대 오차'와 '절대 오차'가 나와 있으니, 이에 유의하며 문제에 접근하면 된다. 

     

     

    이번에 사용할 방법 또한,

    1. Scanner
    2. BufferedReader

    이전 문제와 동일한 방법으로 풀이한다.

     

     

     


    # 풀이 - Scanner

     

     

    * Scanner 

    : 값을 입력받기 위한 클래스.

     

    //데이터를 입력받기 위한 클래스
    import java.util.Scanner;
    
    public class Main {
    	public static void main(String[] args) {
     
     		//선언
    		Scanner scan = new Scanner(System.in); //System.in -> Byte 단위로 값을 읽음.
    		int A = scan.nextInt(); //공백을 제외해서 읽음, int값을 받아들임.
    		int B = scan.nextInt();
            
            //입력되는 숫자 범위를 지정해줄 수 있다.
            //if((0<A && A<10) && (0<A && A<10)) {
    			System.out.println(A/B);
    		}
    
            //Scanner 사용 후 close()
    		scan.close();
    	}
    }

     


     

    위 방식대로 푸는 경우, 아마 틀린 결과가 나올 것이다. (...)

     

    [1008번] - 오차 범위를 벗어나 틀린 문제

     

    이는 출력 결과에 합당하지 않아 발생한 문제로, 자료형을 변경하여 문제를 해결해주어야 한다. 

    결론적으로 풀이의 답은 int를 'double'로 변경해야 한다는 것이다.

     

    * Java 정수형 / 실수형 데이터 타입

    더보기

    기존에 사용하던 int형은 '정수형 데이터 타입'으로, 소수점 자리를 표현하지 못해 문제를 해결하지 못했다.

     

    ex> 1 / 3 의 결과 (int)

    public class Main {
        public static void main(String[] args) {
    
    		int a = 1;
    		int b = 3;
            
    		System.out.println(a/b); //결과 0
        }
    }

     

    즉, 예제 출력처럼 소수점 자리를 표현하려면 '실수형 데이터 타입'을 사용해야 하므로, int 대신 float, double을 사용하여야 한다.

     

     

    ex> 1 /3 의 결과 (float)

    public class Main {
        public static void main(String[] args) {
    
    		float a = 1;
    		float b = 3;
            
    		System.out.println(a/b); //결과 0.33333334
        }
    }

    하지만 float를 사용하여도 원하는 출력값이라고 할 순 없다. 

    출력 조건을 살펴보면 '소수부분 9번째 자리까지'가 출력 조건이므로, 6자리까지 출력하는 float는 답이 될 수 없다.

     

     

    ex> 1 / 3 결과 (double)

    public class Main {
        public static void main(String[] args) {
    
    		double a = 1;
    		double b = 3;
            
    		System.out.println(a/b); //결과 0.3333333333333333
        }
    }

    결론적으로 소수점 15자리까지 출력하는 double이 답이 되는 것을 알 수 있다.

     

    //데이터를 입력받기 위한 클래스
    import java.util.Scanner;
    
    public class Main {
    	public static void main(String[] args) {
     
     		//선언
    		Scanner scan = new Scanner(System.in);
            //double을 사용해 나눗셈 이후 소수점 자리까지 표현할 수 있도록 함.
    		double A = scan.nextDouble(); 
    		double B = scan.nextDouble();
            
    		System.out.println(A/B);
    
            
            //Scanner 사용 후 close()
    		scan.close();
    	}
    }

     

     


     

    # 추가 풀이 (1)  - BufferReader 

     

     

    * BufferReader

    : Scanner와 유사한 기능 / 버퍼 사용, 속도에 있어 우위

     

     

    이전 문제에서처럼, [BufferedReader].readLine 로 읽어들일 경우, 행을 모두 읽어오기에 이를 분리해주어야 한다.

    1. StringTokenizer
    2. Split()

    위의 두가지 방법으로 분리하여 사용하고자 한다. (출력 범위를 고려하며 작성한다!)

     

     

    방법1. StringTokenizer 사용하기

    //BufferedReader를 사용하기 위해 import 한다.
    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 read = new BufferedReader(new InputStreamReader(System.in)); //System.in 대신, Stream, Reader, File이 입력될 수 있다.
     		
            
            // (1). String 생성 후 작업하기
            String text = read.readLine();
            
            //StringTokenizer - 문자열을 구분자로 쪼개어 저장한다. (토큰(Token) 형태로 저장)
            StringTokenizer str = new StringTokenizer(text," ");
            
            // *** tip. String 선언 없이 사용 가능하다. (15, 18줄 해당)
            //StringTokenizer st = new StringTokenizer(read.readLine()," "); 
            
            //Double
    		double a = Double.parseDouble(str.nextToken());
    		double b = Double.parseDouble(str.nextToken());
            
    		System.out.println(a/b);
    	
    	}
    }

     

     

    방법2. split() 사용하기

    //BufferedReader를 사용하기 위해 import 한다.
    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 read = new BufferedReader(new InputStreamReader(System.in)); //System.in 대신, Stream, Reader, File이 입력될 수 있다.
            
            //split()을 사용해 한글자씩으로 쪼갬.
            String[] str = read.readLine().split(" ");
            
            //문자(문자열) 형태로 출력되기에 int로 변환한다.
    		double a = Double.parseDouble(str[0]);
    		double b = Double.parseDouble(str[1]);
            
    		System.out.println(a/b);
    	
    	}
    }

     

     

     

     

    728x90

    댓글

Designed by Tistory.