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 ≤ 10 | O(n!) | 완전탐색 |
| n ≤ 20 | O(2^n) | 비트마스크 |
| n ≤ 500 | O(n^3) | 플로이드 |
| n ≤ 2,000 | O(n^2) | 이중 루프 |
| n ≤ 100,000 | O(n log n) | 정렬 |
| n ≤ 1,000,000 | O(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++ | Python | Java |
|---|---|---|---|
| 속도 | ⚡⚡⚡ | ⚡ | ⚡⚡ |
| 난이도 | 😰 | 😊 | 😐 |
| 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: 다음을 확인하세요.
체크리스트:
- 입출력 최적화 (
sync_with_stdio(false)) endl대신\n사용- 시간복잡도 확인 (O(n^2)인데 n=100,000?)
- 불필요한 연산 제거
- 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: 메모리 사용량을 줄이세요.
체크리스트:
- 불필요한 배열 제거
- 배열 크기 최소화
- bool 배열 대신 bitset 사용
- 재귀 깊이 줄이기
예시:
// ❌ 메모리 초과
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문제
- 목표: 백준 골드~플래티넘
추천 순서:
- 브론즈 30문제 (1주)
- 실버 50문제 (1개월)
- 골드 30문제 (2개월)
- 기출 문제 풀이 (1개월)
같이 보면 좋은 글 (내부 링크)
이 주제와 연결되는 다른 글입니다.
- C++ 코딩 테스트 | “백준·프로그래머스” 알고리즘 유형별 STL 활용법
- C++ 코딩테스트 입출력 | “시간 초과(TLE) 났어요” sync_with_stdio 복붙 템플릿
- C++ 알고리즘 | “코딩테스트” 필수 문제 10선
관련 글
- C++ 코딩 테스트 |
- C++ 코딩테스트 입출력 |
- C++ 백준/프로그래머스 C++ 세팅과 입출력 최적화 한 번에 정리 [#32-1]
- 배열과 리스트 | 코딩 테스트 필수 자료구조 완벽 정리
- C++ Algorithm Copy |