C++ 코딩테스트 팁 | "백준/프로그래머스" 합격하는 10가지 비법

C++ 코딩테스트 팁 | "백준/프로그래머스" 합격하는 10가지 비법

이 글의 핵심

C++ 코딩테스트 팁에 대해 정리한 개발 블로그 글입니다. #include <bits/stdc++.h>

코딩테스트 필수 템플릿

#include <bits/stdc++.h>  // 만능 헤더 (대부분의 STL 포함)
using namespace std;

int main() {
    ios_base::sync_with_stdio(false);  // 입출력 속도 향상
    cin.tie(NULL);
    
    // 코드 작성
    
    return 0;
}

팁 1: 입출력 최적화

TLE(시간 초과) 방지

// ❌ 느린 코드
cout << x << endl;  // endl은 버퍼를 비워서 느림

// ✅ 빠른 코드
cout << x << '\n';  // \n 사용

대량 입력 처리

// 빠른 입력
int n;
cin >> n;
vector<int> v(n);
for (int& x : v) cin >> x;  // 참조 사용

팁 2: STL 컨테이너 활용

vector (동적 배열)

vector<int> v;
v.push_back(1);      // 끝에 추가
v.pop_back();        // 끝 제거
v.size();            // 크기
v[0];                // 접근 (빠름)

map (키-값 쌍)

map<string, int> m;
m["apple"] = 100;
m.count("apple");    // 존재 여부 (0 or 1)
m.find("apple");     // 찾기

set (중복 없는 집합)

set<int> s;
s.insert(1);         // 추가
s.erase(1);          // 제거
s.count(1);          // 존재 여부

팁 3: 자주 쓰는 알고리즘

정렬

vector<int> v = {3, 1, 4, 1, 5};

// 오름차순
sort(v.begin(), v.end());

// 내림차순
sort(v.begin(), v.end(), greater<int>());

// 커스텀 정렬
sort(v.begin(), v.end(),  {
    return a > b;  // 내림차순
});

이진 탐색

vector<int> v = {1, 2, 3, 4, 5};

// 값 찾기
bool found = binary_search(v.begin(), v.end(), 3);

// 위치 찾기
auto it = lower_bound(v.begin(), v.end(), 3);
int index = it - v.begin();

순열/조합

vector<int> v = {1, 2, 3};

// 다음 순열
do {
    // v 출력
} while (next_permutation(v.begin(), v.end()));

팁 4: 시간복잡도 체크

입력 크기시간복잡도알고리즘
n ≤ 10O(n!)완전탐색
n ≤ 20O(2^n)비트마스크
n ≤ 500O(n^3)플로이드
n ≤ 2,000O(n^2)이중 루프
n ≤ 100,000O(n log n)정렬
n ≤ 1,000,000O(n)선형 탐색

팁 5: 자주 하는 실수

실수 1: int 오버플로우

// ❌ 오버플로우
int a = 1000000;
int b = 1000000;
int c = a * b;  // 오버플로우!

// ✅ long long 사용
long long c = (long long)a * b;

실수 2: 배열 범위 초과

// ❌ 위험한 코드
int arr[100];
arr[100] = 1;  // 범위 초과!

// ✅ vector 사용 (안전)
vector<int> v(100);
v[99] = 1;  // OK

실수 3: 초기화 안 함

// ❌ 쓰레기 값
int dp[100][100];
// dp[i][j] 사용 시 쓰레기 값

// ✅ 초기화
int dp[100][100] = {0};
// 또는
memset(dp, 0, sizeof(dp));

팁 6: 디버깅 팁

// 디버그 출력 (제출 전 삭제)
#define DEBUG
#ifdef DEBUG
    #define debug(x) cout << #x << " = " << x << endl
#else
    #define debug(x)
#endif

debug(n);  // "n = 10" 출력

팁 7: 자주 나오는 패턴

투 포인터

int left = 0, right = 0;
while (right < n) {
    // 조건 체크
    if (조건) {
        // 답 갱신
        left++;
    }
    right++;
}

슬라이딩 윈도우

int sum = 0;
for (int i = 0; i < k; i++) sum += arr[i];

for (int i = k; i < n; i++) {
    sum += arr[i] - arr[i-k];
    // 답 갱신
}

팁 8: 시험장 체크리스트

  • 입출력 최적화 (sync_with_stdio, cin.tie)
  • endl 대신 \n 사용
  • int 오버플로우 체크
  • 배열 범위 체크
  • 초기화 확인
  • 시간복잡도 계산
  • 엣지 케이스 테스트 (n=0, n=1)

팁 9: 백준 자주 나오는 유형

유형 1: 구현 (시뮬레이션)

// 예: 배열 회전, 시계 시뮬레이션
// 핵심: 문제를 정확히 이해하고 구현

대표 문제:

  • 백준 14499 (주사위 굴리기)
  • 백준 14503 (로봇 청소기)

:

  • 조건을 빠짐없이 체크
  • 디버그 출력으로 중간 상태 확인

유형 2: 그리디

// 예: 동전 거스름돈, 회의실 배정
// 핵심: 정렬 후 탐욕적 선택

vector<pair<int,int>> meetings;
sort(meetings.begin(), meetings.end(),  {
    return a.second < b.second;  // 끝나는 시간 기준 정렬
});

대표 문제:

  • 백준 11047 (동전 0)
  • 백준 1931 (회의실 배정)

유형 3: 동적 계획법 (DP)

// 예: 피보나치, 배낭 문제
// 핵심: 점화식 세우기

int dp[1001];
dp[0] = 0;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
    dp[i] = dp[i-1] + dp[i-2];
}

대표 문제:

  • 백준 1003 (피보나치 함수)
  • 백준 9251 (LCS)

유형 4: 그래프 탐색 (BFS/DFS)

// BFS (최단 거리)
queue<int> q;
q.push(start);
visited[start] = true;

while (!q.empty()) {
    int cur = q.front();
    q.pop();
    
    for (int next : graph[cur]) {
        if (!visited[next]) {
            visited[next] = true;
            q.push(next);
        }
    }
}

대표 문제:

  • 백준 1260 (DFS와 BFS)
  • 백준 7576 (토마토)

팁 10: 자주 쓰는 STL 함수

최댓값/최솟값

int maxVal = *max_element(v.begin(), v.end());
int minVal = *min_element(v.begin(), v.end());

합계

int sum = accumulate(v.begin(), v.end(), 0);

중복 제거

sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());

역순 정렬

reverse(v.begin(), v.end());

개수 세기

int cnt = count(v.begin(), v.end(), target);

실전 문제 풀이 예시

예시 1: 두 수의 합 (백준 스타일)

문제: 배열에서 합이 target인 두 수 찾기

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    int n, target;
    cin >> n >> target;
    
    vector<int> arr(n);
    for (int& x : arr) cin >> x;
    
    // 투 포인터
    sort(arr.begin(), arr.end());
    int left = 0, right = n - 1;
    int count = 0;
    
    while (left < right) {
        int sum = arr[left] + arr[right];
        if (sum == target) {
            count++;
            left++;
            right--;
        } else if (sum < target) {
            left++;
        } else {
            right--;
        }
    }
    
    cout << count << '\n';
    return 0;
}

예시 2: 최대 부분 배열 합

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    int n;
    cin >> n;
    
    vector<int> arr(n);
    for (int& x : arr) cin >> x;
    
    // 카데인 알고리즘
    int maxSum = arr[0];
    int currentSum = arr[0];
    
    for (int i = 1; i < n; i++) {
        currentSum = max(arr[i], currentSum + arr[i]);
        maxSum = max(maxSum, currentSum);
    }
    
    cout << maxSum << '\n';
    return 0;
}

언어별 비교

특성C++PythonJava
속도⚡⚡⚡⚡⚡
난이도😰😊😐
STL강력간단보통
디버깅어려움쉬움보통

권장:

  • 시간 제한 빡빡 → C++
  • 빠른 구현 → Python
  • 안정성 → Java

FAQ

Q1: bits/stdc++.h는 무엇인가요?

A: GCC 전용 만능 헤더입니다.

장점:

  • 모든 STL 포함 (iostream, vector, algorithm 등)
  • 한 줄로 끝

단점:

  • GCC/Clang만 지원 (MSVC 불가)
  • 컴파일 느림

대안 (MSVC 등):

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <map>
#include <set>
#include <queue>

Q2: using namespace std는 써도 되나요?

A: 코딩테스트에서는 괜찮습니다.

코딩테스트:

using namespace std;  // OK (코드 짧게)

실무 프로젝트:

// 비추천 (이름 충돌 가능)
using namespace std;

// 권장
std::cout << "Hello" << std::endl;

Q3: 시간 초과가 자꾸 나요!

A: 다음을 확인하세요.

체크리스트:

  1. 입출력 최적화 (sync_with_stdio(false))
  2. endl 대신 \n 사용
  3. 시간복잡도 확인 (O(n^2)인데 n=100,000?)
  4. 불필요한 연산 제거
  5. STL 알고리즘 활용 (최적화되어 있음)

예시:

// ❌ O(n^2) - TLE
for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
        // ...
    }
}

// ✅ O(n log n) - 통과
sort(v.begin(), v.end());

Q4: 메모리 초과는 어떻게 해결하나요?

A: 메모리 사용량을 줄이세요.

체크리스트:

  1. 불필요한 배열 제거
  2. 배열 크기 최소화
  3. bool 배열 대신 bitset 사용
  4. 재귀 깊이 줄이기

예시:

// ❌ 메모리 초과
int arr[1000000][1000];  // 4GB!

// ✅ 필요한 만큼만
vector<int> arr(n);  // n개만 할당

Q5: 백준과 프로그래머스 차이는?

A: 입출력 방식이 다릅니다.

백준:

  • 표준 입출력 (cin, cout)
  • main 함수에서 직접 처리

프로그래머스:

  • 함수 구현 방식
  • 입출력은 자동 처리
// 백준 스타일
int main() {
    int n;
    cin >> n;
    cout << n << '\n';
}

// 프로그래머스 스타일
int solution(int n) {
    return n;
}

Q6: 코딩테스트 준비 기간은?

A: 실력에 따라 다릅니다.

초보자 (C++ 기초 있음):

  • 기간: 3-6개월
  • 하루: 2-3문제
  • 목표: 백준 실버~골드

중급자 (알고리즘 기초 있음):

  • 기간: 1-3개월
  • 하루: 3-5문제
  • 목표: 백준 골드~플래티넘

추천 순서:

  1. 브론즈 30문제 (1주)
  2. 실버 50문제 (1개월)
  3. 골드 30문제 (2개월)
  4. 기출 문제 풀이 (1개월)

같이 보면 좋은 글 (내부 링크)

이 주제와 연결되는 다른 글입니다.

  • C++ 코딩 테스트 | “백준·프로그래머스” 알고리즘 유형별 STL 활용법
  • C++ 코딩테스트 입출력 | “시간 초과(TLE) 났어요” sync_with_stdio 복붙 템플릿
  • C++ 알고리즘 | “코딩테스트” 필수 문제 10선

관련 글

  • C++ 코딩 테스트 |
  • C++ 코딩테스트 입출력 |
  • C++ 백준/프로그래머스 C++ 세팅과 입출력 최적화 한 번에 정리 [#32-1]
  • 배열과 리스트 | 코딩 테스트 필수 자료구조 완벽 정리
  • C++ Algorithm Copy |