자료구조와 알고리즘/문제풀이

[Baekjoon] 단계별로 풀어보기 : 입출력과 사칙연산

순정법사 2023.08.10

 

이번 알고리즘 문제 풀이는 C로 진행했습니다 

코드에 오탈자나 문제가 있으면 언제든지 댓글로 알려주세요!

 

 

 


 

 

 

A. 입출력과 사칙 연산

 

입출력과 사칙연산 단계

입출력과 사칙연산

www.acmicpc.net

 

 

1. Hello World! 출력하기

a. 문제지  : 2557 

 

b. 정답

1) 출력함수 printf()로 해결하는 방법

 

📚 풀이 1 : printf 함수로 Hello World! 출력하기

#include <stdio.h>

int main() {
    printf("Hello World!");
    return 0;	//프로그램이 정상적으로 종료되었음을 나타냄
}

 

2) iostream 사용

 

📚 풀이 2 : iostream으로 Hello World! 출력하기

#include <iostream>	//표준 라이브러리 헤더 iostream를 사용

int main() {
    std::cout << "Hello, World!" << std::endl;	//출력에 std::cout 스트림을 사용
    					// << 연산자로 문자열을 출력
    					// std::end1로 문자를 출력하고 버퍼를 비움
    return 0;	
}

 

 

2~4. 덧셈 뺄셈 곱셈

a. 문제지 : 1000, 1001, 10998

 

b. 정답

1) 출력함수 printf()로 해결하는 방법

 

📚 풀이 1 : printf 함수로 연산값 출력하기

#include <cstdio>

int main() {
    int A, B;
    
    scanf("%d %d", &A, &B);
    
    int sum = A + B;
    
    printf("%d", sum);
    
    return 0;
}

 

2) iostream 사용

 

📚 풀이 2 : iostream으로 연산값 출력하기

#include <iostream>

int main() {
    int A, B;
    
    std::cin >> A >> B;	//사용자 입력
    
    int sum = A + B;
    
    std::cout << sum << std::endl;	//결과 출력
    
    return 0;
}

 

👉 뺄셈, 곱셈은 수식만 바꿔주자

 

 

5. 나눗셈

a. 문제지: 1008

 

b. 알고리즘

✔ A, B의 조건이 있다는 점

✔ 상대 오차의 범위가 있다는점을 생각하고 문제풀이를 해야 함

 

상대 오차의 범위때문에 자료형에 대한 이해가 필요한 문제!

1/3처럼 무한 소수를 유한개의 비트로 나타내기 위해서 실수 근사 방식을 사용하는데,

근사값을 표현하다 보니 오차가 날수밖에 없음

 

https://ko.wikipedia.org/wiki/부동소수점

 

오차를 줄이기 위해서 최대한 많은 비트를 쓸 수 있는 자료형을 선택해야 하지만

이 번 문제에서는 오차가 10-9 이하 즉, 소수점 자리를 10개 부터는 오차를 허용함

 

실수형 자료형은 float(32비트), double(64비트) 두가지가 있는데 (혹은 long double)

대략적으로 float 가 소수 부분 6자리까지, double은 15자리까지 오차없이 표현하므로 double을 사용해야 하고

출력시 double 자료형은 기본 출력 형식이 소수점 아래 6자리까지 이므로 %.10f이상으로 꼭 지정해야 함!

 

 

[자료형(data type)] 기본형 총정리

더보기 A. 기본 자료형(data type) 1. 기본 자료형 a. 자료형이란? 🌟 해당 데이터가 메모리에 어떻게 저장되고, 프로그램에서 어떻게 처리되어야 하는지를 명시적으로 알려주는 역할 기본 자료형: C

monamu.tistory.com

 

c. 정답

1) 출력함수 printf()로 해결하는 방법

 

📚 풀이 1 : printf 함수로 연산값 출력하기

#include <cstdio>

int main() {
    int A, B;	//만약 int가 아닌 double로 설정한다면 아래 scanf의 서식지정자도 %lf로 변경해야 함
    
    scanf("%d %d", &A, &B);
    
    if (A > 0 && B < 10) {	//조건 설정해주기
        double result = (double)A / B;
        printf("%.13f", result);	//최소 10개 이상
    } else {
        scanf("%d %d", &A, &B);
    }
    
    return 0;
}

 

2) iostream 방식으로 해결하기

 

cin, cout 을 사용할 경우 입력은 문제가 없지만, 소수점 자리를 고정해 출력하려면 두가지를 알아야 함

 

📘 문법

std::fixed		// 소수점 아래로 고정
std::cout.precision(n);	// 실수 전체 자리수 중 n자리 까지 표현

 

🤓 예제 : fixed와 precision 차이점 알기

double a = 3333.333333;
 
std::cout.precision(6);
 
std::cout << a;			// 3333.33 이 출력됨
 
std::cout << std::fixed;	// 고정 소수점 표기로 전환
std::cout << a;			// 3333.333333 이 출력 됨
 
std::cout.unsetf(ios::fixed);	// 고정 소수점 표기 해제
std::cout << a;			// 3333.33 이 출력됨

 

❕ 따라서 아래와 같은 결과가 나온다

 

📚 풀이 2 : iostream 방법으로 출력하기

#include <iostream>
 
using namespace std;
int main(int argc, char const *argv[]) {
 
    double a, b;
    cin >> a >> b;
 
    cout.precision(12);
    cout << fixed;
    cout << a / b;
    return 0;
}

 

문제 풀이 출처 : https://st-lab.tistory.com/212

 

[백준] 1008번 : A/B - [C++]

www.acmicpc.net/problem/1008 1008번: A/B 두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오. www.acmicpc.net 문제 알고리즘 [접근 방법] 이 문제는 '부동 소수점'에 대한 이해를 필요로 하

st-lab.tistory.com

 

 

6. 모든 사칙 연산

a. 문제지 : 10869

 

b. 정답

📚 풀이 : printf 함수로 출력하기

#include <stdio.h>

int main() {
    int A, B;
    
    scanf("%d %d", &A, &B);
    if (A >= 1 && A <= 10000 && B >= 1 && B <= 10000) {	//조건 추가
        int sum = A + B;
        int difference = A - B;
        int product = A * B;
        int quotient = A / B;
        int remainder = A % B;

        printf("%d\n", sum);
        printf("%d\n", difference);
        printf("%d\n", product);
        printf("%d\n", quotient);
        printf("%d\n", remainder);
        } else {
    }
    
    return 0;
}

 

 

7. 입출력을 응용

a. 문제지 : 10926

 

b. 정답

📚 풀이 : printf 함수로 출력하기

#include <stdio.h>
#include <string.h>

int main(){
    char A[100];	//문자열을 저장할 배열로 선언
    scanf("%s", &A);
    
    char str1[] = "??!";	//문자열을 저장할 배열로 선언 및 초기화
    strncat(A, str1, 100);	//strcat(A, str1); 사용도 가능
       
    printf("%s\n", A);	//문자열을 출력할 형식 지정자 %s를 사용
    
    return 0;
}

 

 

8. 식을 직접 세워서 계산하는 문제

a. 문제지 : 18108

 

b. 정답

📚 풀이 : printf 함수로 출력하기

#include <stdio.h>

int main(){
    int year, newYear;
    scanf("%d", &year);	//year 변수에 입력값을 저장
    
    if((year>=1000)&&(year<=3000)){
        newYear = year-543;
        printf("%d\n", newYear);	//%d 형식 지정자를 사용하여 newYear 변수의 값을 출력
    }
    
    return 0;
}

 

 

9. 나머지

a. 문제지 : 10430

 

b. 정답

📚 풀이 : printf 함수로 출력하기

#include <stdio.h>

int main() {
    int A, B, C;
    scanf("%d %d %d", &A, &B, &C);
    if (A >= 2 && B >= 2 && C >= 2 &&
        A <= 10000 && B <= 10000 && C <= 10000) {
        printf("%d\n", (A + B) % C);
        printf("%d\n", ((A % C) + (B % C)) % C);
        printf("%d\n", (A * B) % C);  
        printf("%d\n", ((A % C) * (B % C)) % C); 
    }
    return 0;
}

 

 

10. 곱셈

a. 문제지 : 2588

 

b. 정답

📚 풀이 : printf 함수로 출력하기

#include <stdio.h>

int main() {
    int A, B;
    
    scanf("%d %d", &A, &B);
    if (A >= 100 && B >= 100 && A < 1000 && B < 1000) {
        int newB1 = B % 10;
        int newB2 = (B / 10) % 10;  // 일의 자리 제거하고 십의 자리 추출
        int newB3 = B / 100;
        
        printf("%d\n", A * newB1);
        printf("%d\n", A * newB2);
        printf("%d\n", A * newB3);
        printf("%d\n", A * B);
    }
    
    return 0;
}

 

 

11. 꼬마 정민

a. 문제지 : 11382

 

b. 알고리즘

C 언어에서 10의 12제곱을 표현할 때에는 두가지 방법이 있음

 

1) 지수 표기법

 

10의 12제곱은 1 뒤에 12개의 0이 온 수 즉, 지수 표기법을 사용해서 1e12로 표현

 

#include <stdio.h>

int main() {
    long long number = 1e12;
    printf("10^12 = %lld\n", number);
    return 0;
}

 

2) pow 함수 활용

 

math.h 헤더 파일에 정의된 pow 함수를 사용하여 10의 12제곱을 계산

 

#include <stdio.h>
#include <math.h>

int main() {
    double number = pow(10, 12);
    printf("10^12 = %lf\n", number);
    return 0;
}

 

👉 두 방법 중 첫 번째 방법을 사용해 풀이함!

 

C. 정답

📚 풀이 : printf 함수로 출력하기

#include <stdio.h>

int main() {
    long long A, B, C;

    scanf("%lld %lld %lld", &A, &B, &C);  // %lld 사용하여 long long 입력 받음
    long long number = 1e12;
    if (A >= 1 && A <= number &&
        B >= 1 && B <= number &&
        C >= 1 && C <= number) {
        printf("%lld\n", A + B + C);  // %lld 사용하여 long long 출력
    }

    return 0;
}

 

 

12, 13. 고양이 / 강아지

a. 문제지 :  10171, 10172

 

이스케이프 시퀀스를 정확하게 알아야 풀이 가능!

 

C언어와 프로그램의 이해

더보기 [목차] A. C언어 개요 B. 프로그래밍 언어와 프로그래밍 C. C 프로그램 개요 A. C언어 개요 1. C언어 기초 a. C언어란? 🌟 절차 지향 프로그래밍 언어(procedure-oriented programming language) 저급언어 +

monamu.tistory.com

 

b-1. 정답 : 고양이

📚 풀이 : 고양이

#include <stdio.h>

int main() {
    printf("\\    /\\\n");
    printf(" )  ( ')\n");
    printf("(  /  )\n");
    printf(" \\(__)|\n");
    
    return 0;
}

 

b-2. 정답 : 강아지

📚 풀이 : 강아지

#include <stdio.h>

int main(){
    printf("|\\_/|\n");
    printf("|q p|   /}\n");
    printf("( 0 )\"\"\"\\\n");
    printf("|\"^\"`    |\n");
    printf("||_/=\\\\__|\n");
    return 0;
}