이 포스트는 프로그래밍 문제 사이트 백준 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등에 랭크되었습니다.
'알고리즘 > 백준(BOJ) 문제풀이' 카테고리의 다른 글
[C++ 백준 풀이][Bronze III] 기초 연산 20문제 간단 풀이 (3) (0) | 2021.12.16 |
---|---|
[C++ 백준 풀이][Bronze III] 기초 연산 20문제 간단 풀이 (2) (0) | 2021.12.16 |
[C++ 백준 풀이][Bronze IV] 외국어 문제들 번역 풀이 (0) | 2021.12.15 |
[C++ 백준 풀이][Bronze IV] 20499, 19698, 18408, 19602, 21598, 18411, 18414, 20673, 20976, 18330번 풀이 (0) | 2021.12.15 |
[C++ 백준 풀이][Gold II] 1516번 : 게임 개발 / 2056번 : 작업 (Topological Sort) (0) | 2021.12.15 |