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

[C++ 백준 풀이][Bronze IV] 외국어 문제들 번역 풀이

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

이 포스트에서는 프로그래밍 문제 사이트 백준 Online Judge의 Bronze IV 문제들 중 외국어 문제들을 위주로 풀이할 것입니다.

 

난이도가 Bronze IV로 풀이가 매우 간단하기에 풀이 코드와 간단한 해설만 첨언할 것입니다.

 

 

20353번 : Atrium

#include <cstdio>
#include <cmath>
using namespace std;

int main() {
    double a;
    scanf("%lf", &a);
    printf("%.7lf", sqrt(a)*4);
}

 

정사각형의 면적이 주어질 때 정사각형의 둘레를 출력하는 문제입니다.

 

 

20232번 : Archivist

#include <cstdio>
using namespace std;

int main() {
    int n;
    scanf("%d", &n);
    if(n == 1996 || n == 1997 || n == 2000 || n == 2007 || n == 2008
       || n == 2013 || n == 2018) printf("SPbSU");
    else if(n == 2006) printf("PetrSU, ITMO");
    else printf("ITMO");
}

 

연도가 주어지면 그 해 우승자를 출력하는 노가다 문제입니다.

ITMO가 대부분이므로 SPbSU인 경우만 if 조건문으로 처리해주고 나머지는 else로 처리하면 수월합니다.

 

 

21185번 : Some Sum

#include <cstdio>
using namespace std;

int main() {
    int N;
    scanf("%d", &N);
    if(N%4 == 0) printf("Even");
    else if(N%4 == 2) printf("Odd");
    else printf("Either");
}

 

연속된 N개의 자연수의 합이 짝수인지, 홀수인지, 둘 다일 수 있는지 출력하는 문제입니다.

N이 4의 배수이면 무조건 짝수이고, 4k+2이면 무조건 홀수이며, 그 외에는 둘 다 가능합니다.

 

 

21612번 : Boling Water

#include <cstdio>
using namespace std;

int main() {
    int B, Ans;
    scanf("%d", &B);
    Ans = 5*B-400;
    printf("%d\n", Ans);
    if(Ans > 100) printf("-1");
    else if(Ans < 100) printf("1");
    else printf("0");
}

 

주어진 식대로 끓는 점을 계산하고, 이것이 100을 넘냐 안 넘냐에 따라 1, 0, -1을 출력하면 되는 문제입니다.

 

 

20233번 : Bicycle

#include <cstdio>
using namespace std;

int main() {
    int a, x, b, y, T;
    scanf("%d %d %d %d %d", &a, &x, &b, &y, &T);
    if(T <= 30) printf("%d ", a);
    else printf("%d ", a+(T-30)*x*21);
    if(T <= 45) printf("%d ", b);
    else printf("%d ", b+(T-45)*y*21);
}

 

문자와 값 사이의 적절한 관계식을 찾아서 조건문을 설정하여 각 요금을 출력해주면 되는 문제입니다.

 

 

20352번 : Circus

#include <cstdio>
#include <cmath>
using namespace std;

int main() {
    double Area;
    scanf("%lf", &Area);
    printf("%.7lf", sqrt(Area/3.14159265358979)*2*3.14159265358979);
}

 

원형 천막의 넓이가 주어졌을 때 그 둘레를 구하는 문제입니다.

double 형의 경우 pi값 대입할 때 오차가 발생할 수 있으므로 최대한 긴 자리를 넣어주는 것이 좋습니다.

 

 

21591번 : Laptop Sticker

#include <cstdio>
#include <cmath>
using namespace std;

int main() {
    int a1, b1, a2, b2;
    scanf("%d %d %d %d", &a1, &b1, &a2, &b2);
    if(a1-a2 >= 2 && b1-b2 >= 2) printf("1");
    else printf("0");
}

 

스티커를 붙였을 때 상하좌우로 1cm 이상의 여백이 있냐는 문제입니다.

가로, 세로 차가 모두 2cm 이상 나오면 되므로 검사해주면 됩니다.

 

 

20215번 : Cutting Corners

#include <cstdio>
#include <cmath>
using namespace std;

int main() {
    int a, b;
    scanf("%d %d", &a, &b);
    printf("%.7lf", a+b-sqrt(a*a+b*b));
}

 

가로, 세로를 따라서 자르는 것이 대각선으로 자르는 것보다 얼마나 더 긴지 출력하는 문제입니다.

피타고라스 정리 써서 .7lf 정도로 출력해주면 됩니다.

 

 

23825번 : SASA 모형을 만들어보자

#include <cstdio>
using namespace std;

int main() {
    int a, b;
    scanf("%d %d", &a, &b);
    if(a < b) printf("%d", a/2);
    else printf("%d", b/2);
}

 

입력받은 두 정수 중 작은 것의 절반 값을 출력해주면 됩니다.

 

 

22015번 : 金平糖 (Konpeito)

#include <cstdio>
#include <algorithm>
using namespace std;

int main() {
    int Arr[3];
    scanf("%d %d %d", &Arr[0], &Arr[1], &Arr[2]);
    sort(Arr, Arr+3);
    printf("%d", Arr[2]-Arr[0] + Arr[2]-Arr[1]);
}

 

세 수 정렬해서 최댓값에서 나머지 둘을 뺀 합을 출력해주면 됩니다.

 

 

21335번 : Another Eruption

#include <cstdio>
#include <cmath>
using namespace std;

int main() {
    double Area;
    scanf("%lf", &Area);
    printf("%.7lf", sqrt(Area/3.14159265358979)*2*3.14159265358979);
}

 

위의 Circus 문제와 완전히 동일합니다.

주어진 원의 넓이에 대해 원의 둘레를 출력하는 문제입니다.

 

 

21633번 : Bank Transfer

#include <cstdio>
using namespace std;

int main() {
    double K, Ans;
    scanf("%lf", &K);
    Ans = (double)K/100 + 25;
    if(Ans < (double)100) printf("%.3lf", (double)100);
    else if(Ans > (double)2000) printf("%.3lf", (double)2000);
    else printf("%.3lf", Ans);
}

 

규칙에 따라 수수료가 얼마인지 계산하는 문제입니다.

최소 금액도 정해져 있으므로 조심해야하고, 100을 출력할 때도 double로 바꿔서 출력해주어야 제대로 출력이 됩니다.

 

 

21638번 : SMS from MCHS

#include <cstdio>
using namespace std;

int main() {
    int a, b, c, d;
    scanf("%d %d %d %d", &a, &b, &c, &d);
    if(c < 0 && d >=10) printf("A storm warning for tomorrow! Be careful and stay home if possible!");
    else if(c < a) printf("MCHS warns! Low temperature is expected tomorrow.");
    else if(d > b) printf("MCHS warns! Strong wind is expected tomorrow.");
    else printf("No message");
}

 

문제에서 주어진대로 조건식을 작성하여 출력문을 출력하는 문제입니다.

값이 4개이고 조건문이 4개나 되므로 헷갈리지 않도록 주의합니다.

 

 

21354번 : Äpplen och päron

#include <cstdio>
using namespace std;

int main() {
    int a, b;
    scanf("%d %d", &a, &b);
    if(7*a > 13*b) printf("Axel");
    else if(7*a < 13*b) printf("Petra");
    else printf("lika");
}

 

사과 가격은 7, 배 가격은 13이라고 할 때 두 판매량이 주어지면 어느 쪽이 더 많이 벌었는지 출력하는 문제입니다.

 

 

21631번 : Checkers

#include <cstdio>
using namespace std;

int main() {
    long long a, b;
    scanf("%lld %lld", &a, &b);
    if(a < b) printf("%lld", a+1);
    else printf("%lld", b);
}

 

검은색 블럭이 2개 이상 붙어있으면 하나의 검은색 줄무늬로 셀 때, 검은색 무늬의 최댓값을 구하는 문제입니다.

a와 b의 대소 관계에 의해 답이 바뀌므로 조건문을 이용해주면 되고, 이 때 입력 범위가 int형 범위를 넘어가므로 long long으로 입출력을 해주어야 합니다.

 

 

6810번 : ISBN

#include <cstdio>
using namespace std;

int main() {
    int a, b, c;
    scanf("%d %d %d", &a, &b, &c);
    printf("The 1-3-sum is %d", 9*1 + 7*3 + 8*1 + 0*3 + 9*1 + 2*3 + 1*1 + 4*3 + 1*1 + 8*3 + a*1 + b*3 + c*1);
}

 

주어진 ISBN 공식에 값을 대입해서 출력하는 노가다 계산 문제입니다.

식이 길어서 그렇지 앞의 10자리는 고정이므로 생각보다 어렵지는 않습니다.

 

 

 

Bronze IV 티어에서 풀 수 있는 문제들은 이 정도인 것 같습니다.

다른 문제들은 10^100 정도의 수를 요구하여 C로 풀기는 어렵거나, 언어를 번역하여 해석하기에 무리가 있었습니다.

 

 

 

반응형