천천히 빛나는
백준 단계 3 : 반복문 (C++) 본문
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;
}
최종 코드는 다음과 같다.
'C++ > BAEKJOON (C++)' 카테고리의 다른 글
백준 단계 6 : 심화 1 (C++) (0) | 2023.09.03 |
---|---|
백준 단계 5 : 문자열 (C++) (0) | 2023.08.31 |
백준 단계 4 : 1차원 배열 (C++) (0) | 2023.08.18 |
백준 단계 2 : 조건문 (C++) (0) | 2023.08.14 |
백준 단계 1 : 입출력과 사칙연산 (C++) (0) | 2023.08.13 |