본문 바로가기

별걸다하는 IT/알고리즘 문제풀이

[백준 BAEKJOON]1000번 A+B,1001번 A-B 문제 1008번 A/B문제(사칙연산)

반응형

백준(BAEKJOON) 알고리즘 문제 풀기- 난이도: 하

 

이번엔 사칙연산과 관련된 문제들이예요 

[1000] A+B

----------------------------------------------------------------------------------------

 

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

시간제한: 2초,  메모리 제한 128MB

 

입력: 첫 째 줄에 A와 B가 주어진다. (0<A, B<10)

예시: 1 2

출력: 첫 째 줄에 A+B를 출력한다.

예시: 3

 

 

----------------------------------------------------------------------------------------

[1001] A-B

----------------------------------------------------------------------------------------

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

시간제한: 2초,  메모리 제한 128MB

입력: 첫 째 줄에 A와 B가 주어진다. (0<A, B<10)

예시: 3 2

출력: 첫 째 줄에 A-B를 출력한다.

예시: 1

----------------------------------------------------------------------------------------

[1008] A/B

----------------------------------------------------------------------------------------

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

시간제한: 2초,  메모리 제한 128MB

입력: 첫 째 줄에 A와 B가 주어진다. (0<A, B<10)

출력: 첫 째 줄에 A-B를 출력한다. 절대/상대 오차는 10의 -9승까지 허용한다.

 

예시1

입력: 1 3

출력: 0 333333333333333333333333333333333

예시2

입력: 4 5

출력: 0.8

----------------------------------------------------------------------------------------

 

ANSWER

여기서 조금 까탈스러운건 나눗셈 문제죠.

1000번과 1001번은 덧셈이냐 뺄셈이냐만 다르고 나머지 코드는 동일합니다. 따라서 1000번과 1001번은 같이 작성할게요.

 

[1008] 실수 자료형에서 연산을 할 때는 항상 주의깊게 신경써줘야 하는 절대/상대 오차 개념이 나왔네요.

우리는 오차에 대해서 민감하지않은데요, 그래서 그냥 별생각 없이 나누고 했던 분들은 이 문제를 접하면 절대오차? 이게 뭐지?할 수 있어요. 조금 오차나도 우리 입장에서는 그게 그거라 생각해 신경을 안썼을테니까요 ㅎㅎ

하지만 실제로 수학적 계산이 많고 중요한 프로그램의 경우일수록, 우주 궤도 거리 계산 뭐 DNA 관련 계산 등등.. 어떤 계산 등.. 이런 프로그램들 있잖아요. 이진수 특징 때문에 실수 계산에서 오차는 필연적으로 발생하지만 그 오차의 정도가 매우 중요해요. 오차를 꼭 신경써줘야해요. 이와 같은 오차 때문에 실수를 비교할 때는 당연히 '=='사용을 자제하는 것이 좋습니다.

 

[1008번 오답 이유?]

float의 상대오차 정도는 10^-7정도이고 double은 10^-15 정도입니다. 문제는 10^-9승이므로 float말고 double을 쓰라는 거네요 ㅎㅎ double을 썼는데도 틀렸다고요? printf의 경우 충분한 자릿수를 명시하지 않을 경우 이들은 충분히 많은 자릿수를 출력하지 않기 때문에 정답도 오답처리 될 수 있습니다.

 

[C언어]

문제: 1000번 & 1001번

#include <stdio.h>
int main()
{
    int num1, num2;
    scanf("%d %d", &num1, &num2);
    // 1000번 문제일 경우
    printf("%d", num1 + num2);
    // 1001번 문제일 경우
    printf("%d", num1 - num2);
    return 0;
}

메모리: 1116KB

시간: 0ms

코드 길이: 127B

 

문제 #1008

#include <stdio.h>
int main()
{
    int num1, num2;
    scanf("%d %d", &num1, &num2);
    printf("%.9lf", (double)num1 / num2);
    return 0;
}

 

메모리: 1116KB

시간: 0ms

코드 길이: 138B

 

[C++]

#include <iostream>
int main()
{
    int num1, num2;
    std::cin >> num1 >> num2;
    //1000번 문제일 경우
    std::cout << num1 + num2;
    //1001번 문제일 경우
    std::cout << num1 - num2;
    return 0;
}

 

문제: 1000번 & 1001번

메모리: 1984KB

시간: 0ms

코드 길이: 127B

 

문제: 1008번

#include <iostream>
#include <iomanip>
int main()
{
    int num1, num2;
    std::cin >> num1 >> num2;
    std::cout.precision(9);
    //std::cout<<std::setprecision(9);도 똑같음
    std::cout <<std::fixed<<(double)num1 / num2;
    return 0;
}

메모리: 1984KB

시간: 0ms

코드 길이: 203B

setprecision은 유효숫자 개수를 정해주는 함수이므로 fixed가 생략될경우 답이 틀립니다! 

 

[Java]

1000번, 1001번, 1008번

import java.util.Scanner;
class Main{
    public static void main(String args[]){
        Scanner scn = new Scanner(System.in);
        int a = scn.nextInt();
        int b = scn.nextInt();
        //1000번
        System.out.print(a+b);
        //1001번
        System.out.print(a-b);
        //1008번
        System.out.print((double)a/b);
    }
}

메모리: 14456KB

시간: 108ms

코드 길이: 244B

 

 

 

 

C의 경우 실수 자릿수를 지정해주지 않으면 다 출력되는게 아니라 6자린가? 까지 짤라서 보여줍니다.

하지만 Java의 경우 자료형 크기만큼 출력해줘요 

그래서 코드에 따로 소숫점 자리를 지정하지 않은겁니다. 10^-9보다 더 작은 오차니까~

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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 num1 = Double.parseDouble(st.nextToken());
        double num2 = Double.parseDouble(st.nextToken());
        System.out.println(num1/num2);
        br.close();
    }
}

메모리: 13084KB

시간: 80ms

코드 길이: 511B

 

입력 속도 비교

언어 입력 방법 평균 (초)
1 C11 mmap 0.043
2 C11 fread 0.0799
3 C11 getchar 0.3496
4 C++17 ios_base::sync_with_stdio(false); cin.tie(NULL); 0.5938
5 C++17 ios_base::sync_with_stdio(false); 0.6348
6 Java BufferedReader, Integer.parseInt 0.6585
7 C11 scanf 0.9206
8 PyPy int(sys.stdin.readline()) 0.9229
9 PyPy map(int,os.read(0, 100000000).split('\n')) 1.1169
10 PyPy3 map(int,os.read(0, 100000000).decode('utf-8').split('\n')) 1.5408
11 PyPy int(raw_input()) 1.925
12 C++17 cin.tie(NULL); 2.059
13 C++17 cin 2.1742
14 C# 6.0 int.Parse(Console.ReadLine()) 2.9635
15 Python 3 map(int,os.read(0, 100000000).decode('utf-8').split('\n')) 4.4033
16 Python 3 int(sys.stdin.readline()) 4.4394
17 Java Scanner 4.8448
18 Python 2 map(int,os.read(0, 100000000).split('\n')) 4.8553
19 Python 2 int(sys.stdin.readline()) 5.7471
20 PyPy3 int(sys.stdin.readline()) 6.6291
21 Python 2 int(raw_input()) 8.9765
22 Python 3 int(input()) 12.4443
23 PyPy3 int(input()) 17.3772
24 Python 2 input() 37.7823
25 PyPy input() 110.3676

입력속도 인데요 Java Scanner가 좀 상대적으로 느립니다. 

따라서 입력이 많이 요구될 경우에는, BufferReader로 입력받는걸 추천드려요

반응형