2025.12.31일자로 기록 시작하려 했는데 어제 알바하고 노느라
2026.01.01일자로 기록 시작합니다.
일단 저의 백준입니다.
17~18살 때부터 백준 조금씩 풀었었는데 깃허브, 블로그에 정리할 겸 기초부터 탄탄히 쌓아보려고 처음부터 풀어보려 합니다.
하루 4~6시간 정도 투자할 계획이며 사용 언어는 C, C++ 위주가 될 것 같고 우선순위 큐 같은 거 풀 때는 Python 조금 사용할 것 같습니다.
1008번 A/B
문제 링크
스페셜 저지 문제로 오차가 10-9 이하이면 정답입니다.
코딩 처음 할 때 이 문제를 틀렸던 경험이 있어서 한 번 풀어봤습니다.
매우 간단한 문제라 C로 구현하였습니다.
#include <stdio.h>
int main() {
double A, B; scanf("%lf %lf", &A, &B);
printf("%.9lf", A / B);
}
해당 조건을 만족하기 위해서는 소수점 아래 9자리 이상을 출력하는 것이 안전합니다.
float는 아래 6자리까지만 표현하므로 double을 사용하였습니다.
옛날의 저도 소수점을 고정 하지 않고 float를 사용해서 틀렸던 기억이 있습니다.
생각해보니 이 문제를 C++로 풀어본 적은 없어서 C++로도 구현해보기로 했습니다.
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
double A, B; cin >> A >> B;
cout << fixed << setprecision(9); cout << A / B;
}
C++로 소수점 자리를 고정해본 기억이 없어 찾아보니 iomanip 헤더 속에 fixed와 setprecision(n)을 사용하면 소수점 자릿수를 고정할 수 있었습니다.
여기서 fixed를 사용하지 않으면 setprecision(n)은 소수점 아래 자릿수가 아닌 전체 유효 숫자를 n자리로 제한합니다.
예를 들어
입력:
41 3
출력:
13.6666667
하지만 fixed를 사용할 경우
입력:
41 3
출력:
13.666666667
정상적으로 9자리까지 출력됩니다.
2525번 오븐 시계
문제 링크
이 문제도 코딩 처음할 때 어려워했던 기억이 있어 다시 풀어봤습니다.
#include <stdio.h>
int main() {
int A, B, C; scanf("%d %d %d", &A, &B, &C);
B += C; A += B / 60; B %= 60;
printf("%d %d", A >= 24 ? A - 24 : A, B);
}
분으로 주어지는 추가 시간을 분에 더합니다. 60분으로 제한하기 위해 나머지 연산자 %를 사용했습니다.
B를 60으로 나눈 몫 만큼 시간이 증가하므로 해당 값을 시간에 더해준 뒤, 24시를 넘는 경우에는 24를 빼서 시간을 제한했습니다.
15552번 빠른 A+B
#include <iostream>
using namespace std;
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL);
int T; cin >> T;
while (T--) { int A, B; cin >> A >> B; cout << A + B << '\n'; }
}
ios_base::sync_with_stdio(false)와 cin.tie(NULL) 코드를 추가하고 endl 대신 \n을 사용하면 시간 초과가 나지 않습니다.
기본적으로 C++은 iostream과 cstdio의 버퍼가 동기화 되어 있어 scanf와 cin을 섞어 써도 입력 순서가 꼬이지 않습니다.
ios_base::sync_with_stdio(bool)의 기본값은 true입니다. false로 설정할 경우 이 동기화가 끊어져 C++ 독립 버퍼를 사용하여 속도가 향상됩니다.
ios::sync_with_stdio(bool)로도 작성할 수 있습니다. ios 클래스가 ios_base 클래스를 상속하는 관계에 있어 두 코드는 결과적으로 차이가 없습니다.
두 번째로 cin과 cout는 서로 묶여있습니다. 때문에 입력을 받기 전 출력 버퍼에 쌓여있던 모든 내용을 화면에 내보냅니다.
cout << "input: ";
cin >> input;
그 예시로 해당 코드에서 input: 이라는 문자열이 출력된 후 입력을 받습니다.
버퍼를 비워내는 flush 과정에서 시간이 꽤나 소요됩니다.
cin.tie(NULL)을 선언하게 되면 cin과 cout가 더 이상 묶이지 않게 되어 속도가 상향됩니다.
NULL 대신 nullptr을 사용해도 무방합니다.
endl은 줄을 바꾼 뒤 flush까지 실행합니다. 하지만 \n은 단순 줄바꿈 문자이므로 endl에 비해 매우 빠릅니다.
10951번 A+B - 4
문제 링크
EOF에 관한 문제입니다. End Of File의 약자이며 Ctrl+z로 입력 가능합니다.
#include <iostream>
using namespace std;
int main() {
while (true) {
int A, B; cin >> A >> B;
if (cin.eof()) break;
cout << A + B << '\n';
}
}
cin.eof()로 EOF를 입력 받을 수 있습니다.
공부 중 이러한 방법을 배워 사용해봤습니다.
#include <iostream>
using namespace std;
int main() {
int A, B;
while (cin >> A >> B) cout << A + B << '\n';
}
int X로 선언되었을 경우 cin>>X는 int가 아닌 값을 입력하면 false를 반환합니다.
10818번 최소, 최대
문제 링크
여러 방법으로 풀 수 있어 한 번 풀어봤습니다.
첫 번째 방법은 배열을 사용하지 않는 방법입니다.
#include <iostream>
using namespace std;
int main() {
int N; cin >> N;
int maximum = -1000001, minimum = 1000001;
while (N--) {
int temp; cin >> temp;
maximum = temp > maximum ? temp : maximum;
minimum = temp < minimum ? temp : minimum;
}
cout << minimum << ' ' << maximum;
}
요소를 입력 받을 때마다 최댓값, 최솟값을 갱신합니다. 시간 복잡도는 O(n)입니다.
사용한 방법 중 가장 효율적인 방법입니다.
두 번째 방법은 algorithm 헤더 내 max/min_element를 사용한 방법입니다.
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int N; cin >> N;
int* arr = new int[N]; for (int i = 0; i < N; i++) cin >> arr[i];
cout << *min_element(arr, arr + N) << ' ' << *max_element(arr, arr + N);
}
max/min_element(start, end)는 주소를 반환하기 때문에 *를 사용하여 역참조를 해야합니다.
시간 복잡도는 첫 번째와 동일한 O(n)이지만 첫 번째 방법이 더 빠릅니다.
세 번째 방법은 sort 함수를 이용한 방법입니다.
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int N; cin >> N;
int* arr = new int[N]; for (int i = 0; i < N; i++) cin >> arr[i];
sort(arr, arr + N);
cout << arr[0] << ' ' << arr[N-1];
}
sort(start, end, [key]) 함수의 시간 복잡도는 O(n log n)으로 세 방법 중 가장 비효율적인 방법입니다.
3052번 나머지
#include <iostream>
using namespace std;
int main() {
bool arr[42] = { 0, }; int cnt = 0;
for (int i = 0; i < 10; ++i) {
int t; cin >> t; t %= 42;
if (!arr[t]) { arr[t] = 1; cnt++; }
} cout << cnt;
}
count 함수를 사용하는 방법을 고려해보았으나 해당 코드가 count를 사용한 코드보다 배열을 덜 훑습니다. 시간 복잡도는 같긴 합니다.
중복 요소를 지운다는 점에서 set 컨테이너를 사용해볼까 했지만, 현재 배열 단계 문제를 푸는 것이기도 하고 set은 집합과 맵 단계에서 많이 쓸 것 같아 배열을 이용해 풀어보았습니다.
10811번 바구니 뒤집기
문제 링크
처음에는 해당 문제를 std::swap의 존재를 몰라 swap 매크로를 직접 만들어 사용하려고 했습니다.
코드 구현 이후 std::swap을 알게 되었고 매크로 만들 바에는 함수 쓰는 게 낫고, 함수 쓰더라도 swap보다 reverse가 더욱 직관적이라는 생각이 들어 reverse를 사용하여 구현했습니다.
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int N, M; cin >> N >> M;
int* arr = new int[N + 1]; for (int i = 1; i <= N; i++) arr[i] = i;
while (M--) {
int i, j; cin >> i >> j;
reverse(arr + i, arr + j + 1);
}
for (int i = 1; i <= N; i++) cout << arr[i] << ' ';
}
바구니는 1번부터 입력 받기 때문에 인덱스 0은 사용하지 않고 1부터 사용하였습니다.
Top comments (0)