알고리즘/백준(BOJ) 문제풀이

[C++ 백준 풀이][Bronze III] 기초 연산 20문제 간단 풀이 (1)

restudy 2021. 12. 15. 18:11
반응형

이 포스트는 프로그래밍 문제 사이트 백준 Online Judge의 Bronze III 난이도의 문제들에 대한 풀이 코드와 해설을 다루고 있습니다.

 

 

10824번 : 네 수

#include <iostream>
#include <string>
using namespace std;

int main() {
    string a, b, c, d;
    cin >> a >> b >> c >> d;
    string N = a+b, M = c+d;
    cout << stoll(N)+stoll(M);
}

 

두 정수를 이어붙인 새로운 정수를 만들어야 하는 문제입니다.

이 경우 C++의 string 라이브러리에 있는 stoi(string to int)와 stoll(string to long long) 함수를 이용하면 아주 유용합니다.

문제에서는 int 범위로는 다룰 수 없는 길이가 나오기 때문에 여기서는 stoll 함수를 써야 합니다. (1/20)

 

 

2501번 : 약수 구하기

#include <iostream>
#include <string>
using namespace std;

int main() {
    int a, b, cnt = 0;
    cin >> a >> b;
    for(int i=1; i<=a; i++) {
        for(int j=1; j<=a; j++) {
            if(i*j == a) {
                cnt++;
                if(cnt == b) {
                    printf("%d", i);
                    return 0;
                }
            }
        }
    }
    printf("0");
}

 

약수를 차례대로 구해서 cnt 번째의 약수를 출력해주면 됩니다. (2/20)

 

 

15953번 : 상금 헌터

#include <iostream>
#include <string>
using namespace std;

int main() {
    int T, a, b, sum;
    scanf("%d", &T);
    for(int i=0; i<T; i++) {
        sum = 0;
        scanf("%d %d", &a, &b);
        if(!a) sum += 0;
        else if(a <= 1) sum += 500;
        else if(a <= 3) sum += 300;
        else if(a <= 6) sum += 200;
        else if(a <= 10) sum += 50;
        else if(a <= 15) sum += 30;
        else if(a <= 21) sum += 10;
        if(!b) sum += 0;
        else if(b <= 1) sum += 512;
        else if(b <= 3) sum += 256;
        else if(b <= 7) sum += 128;
        else if(b <= 15) sum += 64;
        else if(b <= 31) sum += 32;
        printf("%d\n", sum*10000);
    }
}

 

경우의 수가 많아 노가다를 해야 하는 문제입니다.

그나마 오른쪽 상한선만 조건으로 잡아주면 되지만, a = 0, b = 0의 예외가 있기 때문에 이것을 처리해주어야 합니다. (3/20)

 

 

1964번 : 오각형, 오각형, 오각형...

#include <iostream>
using namespace std;

int main() {
    int n, sum;
    cin >> n;
    if(n == 1) printf("5");
    else {
        sum = 5;
        for(int i=2; i<=n; i++) sum = (sum + 7+3*(i-2))%45678;
        printf("%d", sum);
    }
}

 

원래라면 일반화 공식을 만들어서 풀어야하겠지만, 브론즈 문제의 경우 그냥 반복문으로 구해도 문제 없습니다.

그래서 위처럼 반복문으로 합을 구했고, 문제에서 45678로 나눈 나머지를 답으로 출력하라고 했으므로 그 나머지를 구해주었습니다. (4/20)

 

 

2355번 : 시그마

#include <iostream>
using namespace std;

int main() {
    long long a, b, sum = 0;
    cin >> a >> b;
    if(a > b) {
        int temp = a;
        a = b;
        b = temp;
    }
    if(a >= 0 && b >= 0) {
        sum += b*(b+1)/2;
        sum -= a*(a-1)/2;
    }
    else if(a < 0 && b >= 0) {
        sum += b*(b+1)/2;
        sum -= a*(a-1)/2;
    }
    else if(a < 0 && b < 0) {
        sum -= a*(a-1)/2;
        sum += b*(b+1)/2;
    }
    cout << sum;
}

 

두 정수의 구간합을 구하는 문제인데, 1~n 까지의 합 = n*(n+1)/2 공식을 이용하였습니다.

먼저 크기순 배열을 해주고, 그 다음 각 수가 음수나 양수냐에 따라 다른 공식을 적용하였습니다. (5/20)

 

 

2511번 : 카드놀이

#include <iostream>
using namespace std;

int main() {
    int a[10], b[10], sum1 = 0, sum2 = 0, lastwin = 0;
    for(int i=0; i<10; i++) scanf("%d", &a[i]);
    for(int i=0; i<10; i++) scanf("%d", &b[i]);
    for(int i=0; i<10; i++) {
        if(a[i] > b[i]) sum1 += 3, lastwin = 1;
        else if(a[i] < b[i]) sum2 += 3, lastwin = 2;
        else sum1++, sum2++;
    }
    printf("%d %d\n", sum1, sum2);
    if(sum1 > sum2) printf("A");
    else if(sum1 < sum2) printf("B");
    else {
        if(lastwin == 1) printf("A");
        else if(lastwin == 2) printf("B");
        else printf("D");
    }
}

 

어렵지는 않은데 승점이 같을 때 승리 판정 조건 때문에 코드가 괜히 길어지는 문제입니다.

lastwin 변수를 사용해서 마지막 승자를 기록하는데 사용하였습니다. (6/20)

 

 

2783번 : 삼각 김밥

#include <iostream>
using namespace std;

int main() {
    double a, b, ans = 100000000;
    int n;
    scanf("%lf %lf", &a, &b);
    if(1000/b*a < ans) ans = 1000/b*a;
    scanf("%d", &n);
    for(int i=1; i<=n; i++) {
        scanf("%lf %lf", &a, &b);
        if(1000/b*a < ans) ans = 1000/b*a;
    }
    printf("%.3lf", ans);
}

 

그램 당 가격이 제일 싼 지점을 계산해서 ans를 계속해서 갱신해주면 됩니다.

1000g의 가격은 1000/y*x로 계산할 수 있습니다. (7/20)

 

 

5361번 : 전투 드로이드 가격

#include <iostream>
using namespace std;

int main() {
    int T;
    double a, b, c, d, e;
    scanf("%d", &T);
    for(int i=0; i<T; i++) {
        scanf("%lf %lf %lf %lf %lf", &a, &b, &c, &d, &e);
        printf("$%.2lf\n", a*350.34+b*230.90+c*190.55+d*125.30+e*180.90);
    }
}

 

표에 제시된 가격대로 합산한 가격을 구해주면 됩니다.

이 때 int형으로 변수를 받으면 계산할 때 자료형이 문제가 되므로 미리 double 형으로 받아놓으면 편합니다. (8/20)

 

 

11006번 : 남욱이의 닭장

#include <iostream>
using namespace std;

int main() {
    int T, N, M;
    cin >> T;
    for(int i=0; i<T; i++) {
        cin >> N >> M;
        cout << M*2-N << " " << M-(M*2-N) << "\n";
    }
}

 

다리가 1개인 닭의 수는 2M-N이고, 나머지 정상 닭은 그 값을 M에서 빼면 되므로 쉽게 계산할 수 있습니다. (9/20)

 

 

5618번 : 공약수

#include <cstdio>
using namespace std;

int main() {
    int N, a, b, c;
    scanf("%d", &N);
    if(N == 2) scanf("%d %d", &a, &b);
    else scanf("%d %d %d", &a, &b, &c);
    for(int i=1; i<=a; i++) {
        if(N == 2 && a%i == 0 && b%i == 0) printf("%d\n", i);
        else if(N == 3 && a%i == 0 && b%i == 0 && c%i == 0) printf("%d\n", i);
    }
}

 

N이 2 또는 3으로 고정되어 있으므로 그냥 경우를 나누어서 공약수를 직접 계산하면 됩니다.

브론즈 문제이기 때문에 이런 방식으로 계산을 수행해도 시간 초과에 걸리지 않습니다. (10/20)

 

 

5354번 : J박스

#include <cstdio>
using namespace std;

int main() {
    int T, N;
    scanf("%d", &T);
    for(int i=0; i<T; i++) {
        scanf("%d", &N);
        if(N == 1) {
            printf("#\n\n");
            continue;
        }
        for(int j=0; j<N; j++) printf("#");
        printf("\n");
        for(int j=1; j<=N-2; j++) {
            printf("#");
            for(int k=1; k<=N-2; k++) printf("J");
            printf("#\n");
        }
        for(int j=0; j<N; j++) printf("#");
        printf("\n\n");
    }
}

 

규칙대로 출력만 해주면 되지만, 박스 사이에 1줄을 더 띄어야 한다는 출력 양식과 N = 1일 때 #만 출력되도록 해야하기 때문에 예외를 충분히 고려해주어야 하는 문제입니다. (11/20)

 

 

4892번 : 숫자 맞추기 게임

#include <cstdio>
using namespace std;

int main() {
    int i = 1, n0, n1, n2, n3, n4;
    while(1) {
        scanf("%d", &n0);
        if(!n0) break;
        printf("%d. ", i);
        n1 = 3*n0;
        if(n1%2) printf("odd "), n2 = (n1+1)/2;
        else printf("even "), n2 = n1/2;
        n3 = 3*n2;
        n4 = n3/9;
        printf("%d\n", n4);
        i++;
    }
}

 

문제에서 하라는 절차대로 식을 계산해서 조건문을 만들어 출력해주면 되는 문제입니다. (12/20)

 

 

11023번 : 더하기 3

#include <cstdio>
using namespace std;

int main() {
    int n, sum = 0;
    while(scanf("%d", &n) != EOF) sum += n;
    printf("%d", sum);
}

 

간단한 덧셈 문제이지만, EOF 부분을 잘 처리해야 정답 인정을 받을 수 있습니다. (13/20)

 

 

14656번 : 조교는 새디스트야!

#include <cstdio>
using namespace std;

int main() {
    int n, value, cnt = 0;
    scanf("%d", &n);
    for(int i=1; i<=n; i++) {
        scanf("%d", &value);
        if(value != i) cnt++;
    }
    printf("%d", cnt);
}

 

문제가 이해가 되지 않을 수도 있는데, 정렬 문제가 아니라 그냥 해당 위치 번호가 자기 번호와 다르면 cnt를 세어주는 문제입니다. (14/20)

 

 

16673번 : 고려대학교에는 공식 와인이 있다

#include <cstdio>
using namespace std;

int main() {
    int c, k, p, sum = 0;
    scanf("%d %d %d", &c, &k, &p);
    for(int i=1; i<=c; i++) sum += (k*i + p*i*i);
    printf("%d", sum);
}

 

주어진 공식을 시그마 합으로 계산하여 출력해주면 되는 문제입니다.

합을 미리 구할 필요 없이 반복문 돌려서 계산해주면 됩니다. (15/20)

 

 

9550번 : 아이들은 사탕을 좋아해

#include <cstdio>
using namespace std;

int main() {
    int T, N, K, val, sum;
    scanf("%d", &T);
    for(int i=0; i<T; i++) {
        sum = 0;
        scanf("%d %d", &N, &K);
        for(int j=0; j<N; j++) {
            scanf("%d", &val);
            sum += val/K;
        }
        printf("%d\n", sum);
    }
}

 

아이들이 한 종류의 사탕만 K개 먹는다고 하였으므로, K로 나눈 몫만 일일이 합해주면 되는 문제입니다. (16/20)

 

 

10409번 : 서버

#include <cstdio>
using namespace std;

int main() {
    int i, N, Value, Time, Sum = 0;
    scanf("%d %d", &N, &Time);
    for(i=1; i<=N; i++) {
        scanf("%d", &Value);
        Sum += Value;
        if(Sum > Time) break;
    }
    printf("%d", --i);
}

 

앞에서부터 일의 시간을 더하면서 정해진 시간이 초과되는지 확인하면 됩니다.

for문에서 i를 먼저 증가시키고 확인하기 때문에, 마지막에 i에서 1을 뺀 값을 출력해주어야 합니다. (17/20)

 

 

3028번 : 창영마을

#include <cstdio>
using namespace std;

int main() {
    char c;
    int ball = 1;
    while(scanf("%c", &c) != EOF) {
        if(c == 'A' && ball == 1) ball = 2;
        else if(c == 'A' && ball == 2) ball = 1;
        else if(c == 'B' && ball == 2) ball = 3;
        else if(c == 'B' && ball == 3) ball = 2;
        else if(c == 'C' && ball == 1) ball = 3;
        else if(c == 'C' && ball == 3) ball = 1;
    }
    printf("%d", ball);
}

 

세 가지의 섞는 방법이 있을 때, 예를 들어 A 수행에 대해서는 ball이 1 또는 2일 경우에만 바꿔주면 됩니다.

그 외의 경우에는 ball이 없는 컵만 섞으므로 ball에 변화를 줄 필요가 없습니다. (18/20)

 

 

5073번 : 삼각형과 세 변

#include <cstdio>
using namespace std;

int main() {
    int a, b, c;
    while(1) {
        scanf("%d %d %d", &a, &b, &c);
        if(!a && !b && !c) break;
        else if(a+b <= c || b+c <= a || c+a <= b) printf("Invalid\n");
        else if(a == b && b == c) printf("Equilateral\n");
        else if(a == b || b == c || c == a) printf("Isosceles\n");
        else printf("Scalene\n");
    }
}

 

삼각형의 종류를 출력하는 문제로, 조건문의 순서에 따라 오답이 발생할 수 있습니다.

그리고 Isosceles 조건문에서 c == a 조건을 빠뜨리지 않도록 주의합니다. (19/20)

 

 

5523번 : 경기 결과

#include <cstdio>
using namespace std;

int main() {
    int N, a, b, cnt1 = 0, cnt2 = 0;
    scanf("%d", &N);
    for(int i=0; i<N; i++) {
        scanf("%d %d", &a, &b);
        if(a > b) cnt1++;
        else if(a < b) cnt2++;
    }
    printf("%d %d", cnt1, cnt2);
}

 

N회만큼 두 수의 비교를 통해 count를 진행하고, 그 결과를 출력해주면 되는 문제입니다.

무승부인 경우 count가 되지 않는 조건을 확인해야 합니다. (20/20)

 

 

풀이 결과

 

총 505문제를 해결하여 2059등에 랭크되었습니다.

 

 

 

반응형