동동 개발

[C++] 백준 단계별로 풀기 3단계 : 반복문 (총 12문제) 본문

C++ 공부

[C++] 백준 단계별로 풀기 3단계 : 반복문 (총 12문제)

양동선 2026. 2. 18. 16:01

설 연휴 찬스로 꽤 많이 풀고 있다. 3단계 반복문도 힘내봅시다!

✏️  2739번: 구구단

#include <iostream>
using namespace std;

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

 

가벼운 반복문 문제다. 

 

✏️  10950번: A+B - 3

#include <iostream>
using namespace std;

int main()
{
    int count;
    
    cin >> count ;
    
    for(int i = 0; i < count; i++){
        int a, b;	// 변수를 필요한 위치에서 선언 (변수범위 최소화 = 가독성 증가)
        cin >> a >> b;
        cout << a + b << '\n';
    }
    
    return 0;
}

 

요즘 이렇게 간결한 코드라도 AI에게 더 효율적이고 클린한 코드를 쓰는 방법이 있는지 매번 물어보게 된다.

몰랐던 스킬이나, 내가 놓쳤던 부분을 찾아줘서 도움이 많이 된다.

답은 한 번에 맞혔지만 변수를 모두 맨위에서 선언했더니, 변수는 필요한 위치에 선언하는 것을 추천받았다. 이러면 변수의 범위가 최소화되면서 가독성이 좋아진다고 한다. 위 코드는 모두 수정을 완료한 최종 코드이다.

 

✏️ 8393번: 합

#include <iostream>
using namespace std;

int main()
{
    int n, sum = 0; // sum 같은 누적합은 초기화 꼭 해주자.
    cin >> n;
    
    for(int i=1; i<=n; i++){
        sum+= i;
    }
    
    cout << sum << '\n';
    return 0;
}

 

처음 코드에서 sum = 0으로 초기화 해주지 않았더니 쓰레기 값이 같이 나왔다. 누적합 같이 초기화가 필요한 변수는 꼭 초기화 해주자.

 

 

✏️  25304번: 영수증

#include <iostream>
using namespace std;

int main()
{
    int total_amount, total_num;
    int item, item_num;
    int sum = 0;
    
    cin >> total_amount >> total_num;
    
    for(int i = 0; i < total_num; i++){
        cin >> item >> item_num ;
        sum += item * item_num; 
    }
    
    if (sum == total_amount){
        cout << "Yes" << '\n';
    } else {
        cout << "No" << '\n';
    }
    
    return 0;
}

 

변수가 많은 문제이므로, 변수명을 정확하게 하여 헷갈리지 않도록 노력했다.

그리고 제출한 후, 더 클린하게 다음과 같이 고쳐보았다.

#include <iostream>
using namespace std;

int main()
{
    int total_amount, total_num;
    cin >> total_amount >> total_num;
    
    int sum = 0;	// 누적합은 초기화 필수!
    
    for(int i = 0; i < total_num; i++){
    	int price, quantity;	// 변수 범위 최소화
        cin >> price >> quantity ;
        sum += price * quantity; 
    }
    
    if (sum == total_amount){
        cout << "Yes\n";
        return 0;			// else를 쓰지 않고 if 내에서 끝나게 수정함
    }
        cout << "No\n";
		return 0;
}

 

return 0을 if문에 넣어서 else를 쓰지 않는 방법이 참신했다.

변수의 정의는 변수 범위를 최소화하는 자리에서 해야한다는 것도 기억하자.

더하여, sum으로 누적합을 구해서 total_amount와 같은지 비교하는 방법도 있지만, 차감을 이용하는 방법도 있다.

diff = total_amount로 두고, 반복문 내에서의 가격을 diff에서 계속 차감하는 것이다. 최종적으로 diff==0이라면 Yes로 보는 것도 가능하다. 다양한 방법을 알아가는 게 참신하고 재밌다.

 

✏️  25314번: 코딩은 체육과목 입니다

#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;
    
    for(int i=0; i<n/4; i++){
        cout << "long ";
    }
    
    cout << "int" << '\n';   
    return 0;
}

 

// 4까지  long int
// 8까진  long long int
// 12까지 long long long  -> n/4 만큼 long 반복 출력

이번엔 이와 같은 주석으로 문제를 이해하고 풀어보았다. 이전까진 공책에 했는데, 주석으로 차차 정리하는 것도 좋은 것 같다. 앞으론 이렇게 해야지.

 

 

✏️  15552번: 빠른 A+B

#include <iostream>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    
    int t;
    cin >> t;
    
    for(int i=0; i<t; i++){
        int a, b;
        cin >> a >> b;
        cout << a+b << '\n';
    }
    
    return 0;
}

이 문제에선 'C++을 사용하고 있고 cin/cout을 사용하고자 한다면, cin.tie(NULL) sync_with_stdio(false)를 둘 다 적용해 주고, endl 대신 개행문자(\n)를 쓰자.' 라는 팁을 준다. 입출력 방식이 느리면 시간 초과가 나올 수 있기 때문이다.

endl 대신 \n을 쓰는 것은  이전에 스스로 찾았던 방법이다. 그렇다면 cin.tie(NULL)과 sync_with_stdio(false) 각각은 무엇을 의미하는지 알아보자.

1️⃣ sync_with_stdio(false)

C++의 cin/cout은 C의 scanf/prinf와 동기화 되어 있다. C++와 C의 입출력을 같이 써도 순서가 꼬이지 않게 하기 위함이다. 이 동기화 때문에 cin/cout이 느려진다.

ios::sync_with_stdio(false);

 

이 코드는 동기화를 해제함으로써 속도를 증가시켜 준다. 대신 scanf/printf와 섞어 쓸 수 없다.

 

2️⃣ cin.tie(NULL/nullptr)

기본적으로 cin은 cout에 묶여(tie)있다.

cout.flush()가 cin 전에 자동으로 수행되는데, 이는 입력 이전에 출력이 화면에 확실히 보이게 하는 것이다. 문제는 이 flush가 반복되면 느려진다.

cin.tie(nullptr) //NULL보다 nullptr이 더 정확하다고 한다.

 

따라서 cin의 tie를 풀어줌(null)으로써 불필요한 flush를 제거하여 입력 속도가 빨라지게 할 수 있다.

 

✏️  11021번: A+B - 7

#include <iostream>
using namespace std;

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

이전 문제와 매우 유사했다. 문자열 출력에만 유의하면 된다.

 

 

✏️  11022번: A+B - 8

#include <iostream>
using namespace std;

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

 

 

✏️  2438번: 별 찍기 - 1 

#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;
    
    for(int i=1; i<=n; i++){    // i번째 줄
        for(int j=1; j<=i; j++){ // j번 * 출력
            cout << "*";
        }
        cout << '\n';
    }
    
    return 0;
}

 

 

✏️  2439번: 별 찍기 - 2

#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;
    
    for(int i=1; i<=n; i++){            // i번째 줄
        for(int j=1; j<=(n-i); j++){    // " "를  n-i번
            cout << " ";
        }
        for(int k=1; k<=i; k++){    // "*"을 i번 출력 후 다음 줄으로
            cout << "*";
        }
        cout << '\n';
    }
    
    return 0;
}

 

 

✏️  10952번: A+B - 5

#include <iostream>
using namespace std;

int main()
{
    int a, b;
    
    while(true){
        cin >> a >> b;
        if(a!=0 || b!=0){
            cout << a+b << '\n';
        } else{
            break;
        }
    }
    
    return 0;
}

 

처음엔 do while을 사용했는데 조건이 중첩하는 기분이 들었다. 

그래서 while(true)로 반복문이 계속 돌게 하고, if문으로 break하는 식으로 로직을 바꾸었더니 코드가 훨씬 깔끔해졌다.

 

✏️  10951번: A+B - 4 (EOF에 관하여...)

이 문제에서 제일 중요한 부분은 EOF 처리 + 입력 스트림 상태의 이해가 아닐까 싶다.

문제에서는 입력의 총 개수가 주어지지 않았다. 언제까지 a+b를 출력해야 할까?

EOF(End Of File)란 컴퓨터에서 파일의 끝 또는 데이터 스트림의 종료를 나타내는 조건이다. 더 이상 읽을 게 없다는 의미인 것이다.

 

반복할 횟수를 아는 경우 for를, 모를 경우 while을 사용하는 것이 좋다. 

최종적으로 while 조건에 입력을 직접 넣어, 입력 실패시 false 상태가 되어 반복문이 종료되는 형태로 프로그래밍 했다.

#include <iostream>
using namespace std;

int main()
{
    int a, b;
    
    while(cin >> a >> b){   // 입력이 들어오는 경우에만
        cout << a+b << '\n';
    }
    
    return 0;
}

 

어떻게 하는지 몰라 다른 블로그를 많이 참고했다.

출처: https://st-lab.tistory.com/257

 

후훗 모두 성공!



드디어 3단계도 끝났다! 4단계로 넘어가자~