본문 바로가기
Language/C++

[C++_백준] for문 ( 2739, 10950, 8393, 15552, 2741, 2742, 11022, 2438, 2439, 10871 )

by 전전긍긍 2022. 1. 6.

2739. 구구단

 

문제

N을 입력받은 뒤, 구구단 N단을 출력하는 프로그램을 작성하시오. 출력 형식에 맞춰서 출력하면 된다.

 

입력

첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 9보다 작거나 같다.

 

출력

출력형식과 같게 N*1부터 N*9까지 출력한다.

 

소스코드
#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;
    
    for (int i = 1; i < 10; i++)
    {
        int sum = n * i;
        cout << n << " * " << i << " = " << sum << endl;
    }
    
    return 0;
}

 


10950. A + B - 3

 

문제

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

 

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)

 

출력

각 테스트 케이스마다 A+B를 출력한다.

 

소스코드
#include <iostream>
using namespace std;

int main()
{
    int t;
    cin >> t;
    
    int a,b;
    for (int i = 0; i < t; i++)
    {
        cin >> a >> b;
        int sum = a + b;
        cout << sum << endl;
    }
    return 0;
}

8393. 합

 

문제

n이 주어졌을 때, 1부터 n까지 합을 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 n (1 ≤ n ≤ 10,000)이 주어진다.

 

출력

1부터 n까지 합을 출력한다.

 

소스코드
#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;
    
    int sum = 0;
    
    for (int i = 1; i <= n; i++)
    {
        sum = sum + i;
    }
    
    cout << sum << endl;
    return 0;
}

15552. 빠른 A+B

 

문제

본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다.

C++을 사용하고 있고 cin/cout을 사용하고자 한다면, cin.tie(NULL)과 sync_with_stdio(false)를 둘 다 적용해 주고, endl 대신 개행문자(\n)를 쓰자. 단, 이렇게 하면 더 이상 scanf/printf/puts/getchar/putchar 등 C의 입출력 방식을 사용하면 안 된다.

 

또한 입력과 출력 스트림은 별개이므로, 테스트케이스를 전부 입력받아서 저장한 뒤 전부 출력할 필요는 없다. 테스트케이스를 하나 받은 뒤 하나 출력해도 된다.

 

입력

첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.

 

출력

각 테스트케이스마다 A+B를 한 줄에 하나씩 순서대로 출력한다.

 

소스코드
#include <iostream>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    int n , a, b;
    cin >> n;

    for (int i = 0; i < n; i++)
    {
        cin >> a >> b;
        cout << a + b << '\n';
    }
    return 0;
}

 

ios::sync_with_stdio(false)

C표준 스트림(stdio)와 C++ 표준 스트림(iostream) 간의 동기화를 비활성화하는 것.

→ 실행 속도를 향상하기 위해 ( C++ 스트림 자체의 독립적인 버퍼를 사용하게 되기 때문)

* stdio iostream의 버퍼를 모두 사용하면 딜레이가 발생

 

cin.tie(NULL)

cin과 cout을 풀어준다(untie)한다는 의미 (null이니까)

cin을 입력 받기 전 출력 버퍼를 비우지 않고 사용자에게 입력을 먼저 요청한다.

std::cout << "Enter name:";
std::cin >> name;

 

\n

endl을 쓰지 않고 \n을 쓰는 이유는 속도 향상을 위해서다.

endl을 쓰면 버퍼를 비우는 작업이 들어가기 때문에 속도가 \n에 비해 느리다.

\n은 단순히 개행만 해주기 때문에 속도가 빠르다.

 

✔ 버퍼 buffer

buffer : 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리 영역

 

 

📍 참고자료

https://blog.naver.com/raylee00/222053525656

 

C++ | 왜 std::endl 은 "\n" 보다 느릴까?

이번 글은 std::endl 과 "\n" 의 performance 비교에 대한 글이다. 제목에서도 볼 수 있다시피, ...

blog.naver.com

https://blog.naver.com/harang8069/222425811416

 

[C++] cin.tie(NULL); ios::sync_with_stdio(false); 의 의미, 뜻

cin.tie(NULL); cin과 cout를 풀어준다(untie)는 뜻이다. default 설정은 cin과 cout가 묶여있다.(tie)...

blog.naver.com

https://blog.naver.com/raylee00/222038557757

 

C++ 입출력 속도와 ios_base::sync_with_stdio(false), cin.tie(NULL) 에 관한 글

전에 python의 input() 함수의 속도와 관련된 글을 썼었는데, 요즘에는 C++을 많이 쓰게 되면서 C++에 대...

blog.naver.com

https://blog.naver.com/harang8069/222426218462

 

버퍼란? 버퍼(buffer)의 의미, 뜻

>> 스트림의 의미, 뜻 버퍼 (buffer) 스트림은 내부에 버퍼 (buffer)라는 임시 메모리 공간을 가지고...

blog.naver.com


2741. N 찍기

 

문제

자연수 N이 주어졌을 때, 1부터 N까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

 

입력

첫째 줄에 100,000보다 작거나 같은 자연수 N이 주어진다.

 

출력

첫째 줄부터 N번째 줄 까지 차례대로 출력한다.

 

소스코드
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    int a = 1;
    for(int i = 0; i < n; i++)
    {
        cout << a << '\n';
        a++;
    }
    return 0;
}

2742. 기찍 N

 

문제

자연수 N이 주어졌을 때, N부터 1까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

 

입력

첫째 줄에 100,000보다 작거나 같은 자연수 N이 주어진다.

 

출력

첫째 줄부터 N번째 줄 까지 차례대로 출력한다.

 

소스코드
//방법1
#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;
    int a = n;

    for (int i = 0; i < n; i++)
    {
        cout << a << '\n';
        a--;
    }
    return 0;
}
//방법2
#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;

    for (int i = n; i > 0; i--)
    {
        cout << i << '\n';
    }
    return 0;
}

11021. A+B-7

 

문제

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

 

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)

 

출력

각 테스트 케이스마다 "Case #x: "를 출력한 다음, A+B를 출력한다. 테스트 케이스 번호는 1부터 시작한다.

 

소스 코드
#include <iostream>
using namespace std;

int main() {
    int t, a, b;
    //개수
    cin >> t;

    for (int i = 1; i <= t; i++)
    {
        cin >> a >> b;
        cout << "Case #" << i << ": " << a + b << "\n";
    }

    return 0;
}

11022. A+B-8

 

문제

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

 

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)

 

출력

각 테스트 케이스마다 "Case #x: A + B = C" 형식으로 출력한다. x는 테스트 케이스 번호이고 1부터 시작하며, C는 A+B이다.

 

소스 코드
#include <iostream>
using namespace std;

int main() {
    int t, a, b;
    cin >> t;
    
    for(int i = 1; i <= t; i++)
    {
        cin >> a >> b;
        cout << "Case #" << i << ": " << a << " + " << b << " = " << a+b << "\n";
    }
}

2483. 별 찍기 - 1

 

문제

첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제

 

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

 

출력

첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.

 

소스 코드
#include <iostream>
using namespace std;

int main() {
    int t;
    cin >> t;

    for (int i = 1; i <= t; i++)
    {
        for (int j = 1; j <= i; j++)
        {
            cout << "*";
        }
        cout << "\n";
    }
    return 0;
}

2439. 별 찍기 - 2

 

문제

첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제

하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.

 

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

 

출력

첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.

 

소스 코드
#include <iostream>
using namespace std;

int main() {
    int t;
    cin >> t;

    for (int i = 1; i <= t; i++)
    {
        //공백
        for (int j = t - i; j > 0; j--)
            cout << " ";
        //별
        for (int j = 0; j < i; j++)
            cout << "*";
        cout << "\n";
    }
    return 0;
}

10871. X보다 작은 수

 

문제

정수 N개로 이루어진 수열 A와 정수 X가 주어진다. 이때, A에서 X보다 작은 수를 모두 출력하는 프로그램을 작성하시오.

 

입력

첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000)

둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다.

 

출력

X보다 작은 수를 입력받은 순서대로 공백으로 구분해 출력한다. X보다 작은 수는 적어도 하나 존재한다.

 

소스 코드
#include <iostream>
using namespace std;

int main() {
	int n, x;
	cin >> n >> x;

	for (int i = 0; i < n; i++)
	{
		int t;
		cin >> t;
		if (t < x)
		{
			cout << t << " ";
		}
	}
	
	return 0;
}

 

+) 10871번. 다른 사람은 어떻게 풀었나 궁금해서 찾아보다가 잘 정리되어 있는 블로그 글을 보았다.

특히 그 블로그의 작성자분이 기본적인 방법이라고 하신 1번쨰 방법 부분이 인상 깊었다.

 

나는 백준 문제에서 "첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000)" 이 부분을 지금까지 무시하면서 풀었다.

근데 이것을 활용할 수도 있다는 생각을 가지게 해주셨다.

 

아래 블로그 글을 보면 더 확실하게 이해가 될 것이다.

(이 분께서 3가지 방법을 제시해주셨는데, 1번째 방법이 나에게 새로웠다. 그리고 2번째는 내가 풀었던 방식이고, 3번째는 15552번에서 정리를 했었던 표준 입출력 동기화를 끊어주는 방법이다.)

 

https://st-lab.tistory.com/253

 

[백준] 10871번 : X보다 작은 수 - [C++]

https://www.acmicpc.net/problem/10871 10871번: X보다 작은 수 첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000) 둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고,..

st-lab.tistory.com

'Language > C++' 카테고리의 다른 글

[C++_백준] 3003, 5554, 5522  (0) 2022.02.03
[C++_백준] 2914, 1550, 2845  (0) 2022.02.02
[C++_제 17장] 재귀 호출  (0) 2021.12.09
[C++_제 8장] 다차원 배열  (0) 2021.12.09
[C++_제 7장] 1차원 배열과 C-문자열  (0) 2021.12.06