천천히 빛나는

백준 단계 3 : 반복문 (C++) 본문

C++/BAEKJOON (C++)

백준 단계 3 : 반복문 (C++)

까만콩 •ᴥ• 2023. 8. 16. 14:09

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

#include <iostream>
using namespace std;
int main() {
	int n;
	cin >> n;
	for (int i = 1; i < 10; i++)
	{
		cout << n << " * " << i << " = " << n * i << endl;
	}
	return 0;
}

for문의 기본 문법이다.

 

 

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

#include <iostream>
using namespace std;
int main() {
    int t;
    int x, y;
    cin >> t;
    for (int i = 0; i < t; i++) {
        cin >> x >> y;
        cout << x + y << endl;
    }
    return 0;
}

기본적인 for문을 사용하는 방식이다.

 

 

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

#include <iostream>
using namespace std;
int main() {
    int n;
    cin >> n;
    int sum = 0;
    for (int i = 1; i <= n; i++)
    {
        sum += i;
    }
    cout << sum;
    return 0;
}

 

 

25304. 영수증에 적힌, 구매한 각 물건의 가격과 개수와 구매한 물건들의 총 금액을 보고, 구매한 물건의 가격과 개수로 계산한 총 금액이 영수증에 적힌 총 금액과 일치하는지 검사해보자.

#include <iostream>
using namespace std;
int main(){
    int n, x;
    cin >> x;
    cin >> n;
    int item, price, total = 0;
    for (int i = 0; i < n; i++){
        cin >> item >> price;
        total += item * price;
    }
    if (x == total){
        cout<<"Yes"<<endl;
    }else{
        cout<<"No"<<endl;
    }
    return 0;
}

 

 

25314. 혜아가 N바이트 정수까지 저장할 수 있다고 생각해서 칠판에 쓴 정수 자료형의 이름은 무엇일까?

#include <iostream>
using namespace std;
int main(){
    int n;
    cin >> n;
    for (int i = 0; i < n/4; i ++){
        cout << "long ";
    }
    cout << "int"<<endl;
    
    return 0;
}

 

 

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

C++을 사용하고 있고 cin/cout을 사용하고자 한다면, cin.tie(NULL) sync_with_stdio(false)를 둘 다 적용해 주고, endl 대신 개행문자(\n)를 쓰자.

 

방법 1 : C 표준 입출력 stdio.h 사용하기

for(int i = 0; i < T; i++) {
	int a, b;
	scanf("%d %d", &a, &b);
	printf("%d\n", a + b);
}

 

방법 2 : iostream의 default 설정 수정

ios_base::sync_with_stdio(false);

c의 stdio와 cpp의 iostream의 동기화를 비활성해주어 c++만의 독립적인 버퍼를 사용하게 된다. 이 코드는 이 문제 뿐 아니라 알고리즘 문제에서 추가해줘도 문제가 없다.

 

cin.tie(NULL); // cin.tie(nullptr), cin.tie(0)와 동일

cin과 cout 묶음을 풀어준다. 예를 들어 입력 요청이 들어왔을 때, 그 전에 출력 잡업이 있을 경우 버퍼를 비워 출력을 하게 된다. 

cout << "이름을 입력하세요: ";
cin >> name;

이와 같은 경우에서 cin과 cout이 묶여잇으면 "이름을 입력하세요: " 가 먼저 출력되지만 cin.tie(NULL);을 추가하면 출력 전에 입력을 받는 경우가 생긴다.

 

#include <iostream>
using namespace std;
int main() {
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);
    
    int t;
    cin >> t;
    int a, b;
    for (int i = 0; i < t; i++){
        cin >> a >> b;
        cout << a+b << "\n";
    }
    return 0;
}

최종코드는 다음과 같다. endl은 단순히 개행(줄바꿈)만 해주는 것이 아니라 출력 버퍼를 비우는 역할까지 한다. endl 을 쓰면 cin과 cout을 끊어주는 것의 효과를 볼 수가 없다.

 

앞으로 나오는 문제에서는 최대한 ios::sync_with_stdio(false);와 cin.tie(null);을 사용하도록 하겠다. 영어는 위에 설명한 그대로라서 암기가 크게 어렵지 않을 것이다. (tie = 묶다, stdio = c언어 입출력)

 

 

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

#include<iostream>
using namespace std;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t, a, b;
    cin >> t;
    for (int i = 1; i <= t; i++){
        cin >> a >> b;
        cout<<"Case #"<< i << ": " << a+b << "\n";
    }
    return 0;
}

for문을 이용한 간단한 문제이다. 11022는 같은 형식의 문제이기 때문에 생략하도록 하겠다.

 

 

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

#include <iostream>
using namespace std;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin >> n;
    for (int i = 0; i < n; i++){
        for (int j = 0; j <= i; j++){
            cout <<"*";
        }
        cout <<"\n";
    }
    return 0;
}

 

 

2439. 첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제. 하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.

#include<iostream>
using namespace std;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin >> n;
    for(int i = 0; i < n; i++){
        for (int j = 0; j < n - i -1; j++){
            cout << " ";
        }
        for (int j = 0; j <= i; j++){
            cout << "*";
        }
        cout << "\n";
    }
    return 0;
}

for 문안에 for문을 2개 사용하여 구현하였다.

 

 

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

#include<iostream>
using namespace std;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int a, b;
    while (1){
        cin >> a >> b;
        if ((a==0)&&(b==0)){
            break;
        }
        cout << a+b<<endl;
    }
    return 0;
}

while문을 이용한 코드이다. while(조건식)

 

 

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

몇 개를 입력받는지 알 수가 없다. 이렇게 주어진 입력 파일만으로 더이상 읽을 수 있는 데이터가 없을 때, EOF(End Of File)이라고 한다. 입력에서 더이상 읽을 수 있는 데이터가 없을 때 반복문을 종료 해야한다.  enter 키인 \n도 하나의 문자이므로 에디터에서는 입력파일을 따로 생성해서 읽지 않는 한 키보드에서 EOF 키를 입력할 수 없다.

while(!(cin >> a >> b).eof()) {
	...
}

eof(): 파일의 끝에 도달한 뒤 읽고자 하면 TRUE 반환

while(!cin.eof()) {
	cin >> val;
	cout << val;
}

위와 같이 작성하면 오류가 발생한다. eof()함수는 파일의 끝에 도달했다고 true를 반환하는 것이 아니라, 도달한 후 그 다음 데이터를 읽고자할 때 true를 반환하는 것이기 때문이다.

즉 a, b, c, d를 입력하면 a, b, c, d, d가 출력된다.

loop cin.eof() cin >> val cout << val
1 False a a
2 False b b
3 False c c
4 False d d
5 False EOF d
6 True break break

 

while(cin >> a >> b) {
	...
}

위와 같은 방식도 가능하다. 

cin이 조건문 안에 있는 경우에 연산자 오버로딩에 의해 bool 타입으로 반환된다. 정상이면 true, 아니면 false이다. 

 

#include<iostream>
using namespace std;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int a, b;
    while(cin >> a >> b){
        cout << a + b << "\n";
    }
    return 0;
}

최종 코드는 다음과 같다.