DEV Community

dbsans
dbsans

Posted on

[BOJ/C, C++] 단계별로 풀어보기 / 입출력과 사칙연산 ~ 1차원 배열

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);
}
Enter fullscreen mode Exit fullscreen mode

해당 조건을 만족하기 위해서는 소수점 아래 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;
}
Enter fullscreen mode Exit fullscreen mode

C++로 소수점 자리를 고정해본 기억이 없어 찾아보니 iomanip 헤더 속에 fixedsetprecision(n)을 사용하면 소수점 자릿수를 고정할 수 있었습니다.

여기서 fixed를 사용하지 않으면 setprecision(n)은 소수점 아래 자릿수가 아닌 전체 유효 숫자를 n자리로 제한합니다.
예를 들어
입력:

41 3
Enter fullscreen mode Exit fullscreen mode

출력:

13.6666667
Enter fullscreen mode Exit fullscreen mode

하지만 fixed를 사용할 경우
입력:

41 3
Enter fullscreen mode Exit fullscreen mode

출력:

13.666666667
Enter fullscreen mode Exit fullscreen mode

정상적으로 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);
}
Enter fullscreen mode Exit fullscreen mode

분으로 주어지는 추가 시간을 분에 더합니다. 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'; }
}
Enter fullscreen mode Exit fullscreen mode

ios_base::sync_with_stdio(false)cin.tie(NULL) 코드를 추가하고 endl 대신 \n을 사용하면 시간 초과가 나지 않습니다.

기본적으로 C++은 iostream과 cstdio의 버퍼가 동기화 되어 있어 scanfcin을 섞어 써도 입력 순서가 꼬이지 않습니다.
ios_base::sync_with_stdio(bool)의 기본값은 true입니다. false로 설정할 경우 이 동기화가 끊어져 C++ 독립 버퍼를 사용하여 속도가 향상됩니다.
ios::sync_with_stdio(bool)로도 작성할 수 있습니다. ios 클래스가 ios_base 클래스를 상속하는 관계에 있어 두 코드는 결과적으로 차이가 없습니다.

두 번째로 cincout는 서로 묶여있습니다. 때문에 입력을 받기 전 출력 버퍼에 쌓여있던 모든 내용을 화면에 내보냅니다.

cout << "input: ";
cin >> input;
Enter fullscreen mode Exit fullscreen mode

그 예시로 해당 코드에서 input: 이라는 문자열이 출력된 후 입력을 받습니다.
버퍼를 비워내는 flush 과정에서 시간이 꽤나 소요됩니다.
cin.tie(NULL)을 선언하게 되면 cincout가 더 이상 묶이지 않게 되어 속도가 상향됩니다.
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';
    }
}
Enter fullscreen mode Exit fullscreen mode

cin.eof()EOF를 입력 받을 수 있습니다.

공부 중 이러한 방법을 배워 사용해봤습니다.

#include <iostream>
using namespace std;
int main() {
    int A, B; 
    while (cin >> A >> B) cout << A + B << '\n';
}
Enter fullscreen mode Exit fullscreen mode

int X로 선언되었을 경우 cin>>Xint가 아닌 값을 입력하면 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;
}
Enter fullscreen mode Exit fullscreen mode

요소를 입력 받을 때마다 최댓값, 최솟값을 갱신합니다. 시간 복잡도는 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);
}
Enter fullscreen mode Exit fullscreen mode

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];
}
Enter fullscreen mode Exit fullscreen mode

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;
}
Enter fullscreen mode Exit fullscreen mode

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] << ' ';
}
Enter fullscreen mode Exit fullscreen mode

바구니는 1번부터 입력 받기 때문에 인덱스 0은 사용하지 않고 1부터 사용하였습니다.

Top comments (0)