1008번 : A/B
두 수를 나눈 몫을 소숫점 아래 9자리까지 정확하게 출력하는 문제입니다.
출력 양식을 %.9lf으로 조절해주면 되며 뒷자리가 0이어도 출력해도 되므로 다른 조작을 할 필요가 없습니다.
#include<stdio.h>
int main() {
double a, b;
scanf("%lf %lf", &a, &b);
printf("%.9lf", a/b);
}
1297번 : TV 크기
대각선 길이에 cos, sin 값을 곱해주면 가로, 세로 길이를 얻을 수 있음을 알 수 있습니다.
문제 조건에서 소숫점이 나오면 그보다 작은 정수를 출력하면 된다고 하였으므로 int 형으로 출력해주면 됩니다.
#include<stdio.h>
#include<math.h>
int main() {
float d, h, w;
scanf("%f %f %f", &d, &h, &w);
printf("%d %d", (int)(d*h/sqrt(h*h+w*w)), (int)(d*w/sqrt(h*h+w*w)));
}
1330번 : 두 수 비교하기
두 수를 비교하여 세 가지 케이스를 나누어 if 문으로 분류하는 문제입니다.
삼항연산자를 사용하면 더 간단하게 짤 수도 있습니다.
#include<stdio.h>
int main() {
int a, b;
scanf("%d %d", &a, &b);
if(a > b) printf(">");
else if(a < b) printf("<");
else printf("==");
}
1712번 : 손익분기점
고정비용 + 가변비용 × n < 노트북 한 대 가격 × n
n을 늘려가다보면 좌변이 더 작아지는 시점이 발생하는데 이 때의 n값을 출력하면 됩니다.
a + bn < cn → (c-b)n > a → n > a/(c-b)
이 때 이익이 "발생하는" 시점의 판매량을 출력하는 문제이므로, int 형으로 계산하여 소숫점이 있든 없든 버려준 다음 1을 더해주면 이익이 발생하는 시점의 판매량이 됩니다.
#include<stdio.h>
int main() {
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
if(c-b <= 0) printf("-1");
else printf("%d", a/(c-b) + 1);
}
2420번 : 사파리월드
두 input의 차이값을 출력하는 문제입니다.
첫 번째 입력이 더 클지 두 번째 입력이 더 클지 알 수 없으므로 조건을 한 번 나누어 계산해주어야 합니다.
입력 범위를 잘 보아야 합니다! -20억 ~ 20억이면 두 수의 차이는 최대 40억으로 int 형의 범위를 벗어나기 때문에 계산 값은 long long int를 이용해 주는 것이 좋습니다. (그냥 %d로 출력하면 틀림)
#include<stdio.h>
int main() {
int a, b;
scanf("%d %d", &a, &b);
if(a > b) printf("%lld", a-b);
else printf("%lld", b-a);
}
2480번 : 주사위 세 개
문제에서 주어진 규칙에 따라, 입력 받은 주사위 눈으로 결과값을 계산하여 출력하는 문제입니다.
조건이 많으므로 경우를 많이 나누어주어야 해서 귀찮을 수 있습니다.
또한 마지막 조건(세 눈이 모두 다른 경우)에서는 최댓값을 구해주어야 하는 귀찮음이 감수됩니다.
#include<stdio.h>
int main() {
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
if (a == b && b == c) printf("%d", 10000 + a * 1000);
else if (a == b) printf("%d", 1000 + a * 100);
else if (b == c) printf("%d", 1000 + b * 100);
else if (c == a) printf("%d", 1000 + c * 100);
else {
int max = a;
if (b > max) max = b;
if (c > max) max = c;
printf("%d", max * 100);
}
}
2525번 : 오븐 시계
시간 계산을 시간과 분 단위를 이용하여 구현하는 문제입니다.
60분이 모이면 시간 단위로 넘겨주고, 24시간이 모이면 계산 대상에서 제외해버리면 됩니다.
#include<stdio.h>
int main() {
int sum, a, b, c;
scanf("%d %d\n%d", &a, &b, &c);
sum = a * 60 + b + c;
printf("%d %d", sum%(24*60)/60, sum%60);
}
저의 경우에는 sum이라는 변수를 선언하여 여기에 분 단위로 모든 시간을 합쳐버리고 하루 치 = 24 * 60분 단위는 계산에서 제외(나머지를 이용)하였고, 그 이후 60으로 나눈 몫은 시간, 60으로 나눈 나머지는 분이 됨을 이용하여 풀이하였습니다.
2530번 : 인공지능 시계
위의 오븐 시계 문제에서 업그레이드 되어 초 단위로 시간 계산을 구현하는 문제입니다.
식만 조금 더 복잡해졌을 뿐, 위의 문제에서 사용한 아이디어를 이용한다면 같은 방식으로 풀 수 있습니다.
#include<stdio.h>
int main() {
int sum, a, b, c, d;
scanf("%d %d %d\n%d", &a, &b, &c, &d);
sum = a * 60 * 60 + b * 60 + c + d;
printf("%d %d %d", sum%(24*60*60)/(60*60), sum%(24*60*60)%(60*60)/60, sum%60);
}
마지막에 출력할 때 분 단위 계산이 조금 어려운데, 이것은 시간 단위 계산에서 마지막 부분을 나머지로 바꾸어준 뒤 그것을 60초로 나눈 몫을 사용해주면 됩니다.
2588번 : 곱셈
곱셈을 손으로 풀이하듯이 계산 과정까지 출력하도록 하는 문제입니다.
원리는 뒤에 곱해지는 수의 각 자릿수에 위의 수를 곱한 것이 하나씩 나오므로, 곱해지는 수의 각 자릿수만 분해할 줄 알면 쉽게 풀이할 수 있습니다.
#include<stdio.h>
int main() {
int a, b;
scanf("%d %d", &a, &b);
printf("%d\n%d\n%d\n%d", a*(b%10), a*(b/10%10), a*(b/100), a*b);
}
이 때 주의해야할 점은 일의 자리가 먼저 곱해지므로 일의 자리, 십의 자리, 백의 자리 순서로 분해하여 곱한 것을 출력해주어야 합니다.
2752번 : 세 수 정렬
입력받은 정수 3개를 오름차순으로 출력하는 문제입니다.
삼항연산자를 사용해도 되고 조건문으로 분류해도 됩니다.
#include<stdio.h>
int main() {
int a, b, c, temp;
scanf("%d %d %d", &a, &b, &c);
if(b > c) {
temp = b;
b = c;
c = temp;
}
if(a > b) {
temp = a;
a = b;
b = temp;
}
if(b > c) {
temp = b;
b = c;
c = temp;
}
printf("%d %d %d", a, b, c);
}
저 같은 경우에는 swap 함수를 세 번 사용하여 문제를 풀이했습니다.
입력이 n개였다면 반복문 + 정렬을 사용했겠지만 입력이 3개이므로 그냥 swap을 일일이 해주는 것으로 대체했습니다.
'알고리즘 > 백준(BOJ) 문제풀이' 카테고리의 다른 글
[C언어 백준 풀이][Bronze III] 유클리드 호제법 응용, 큰 수 나누기 (백준 1837번 : 암호 제작) (0) | 2021.08.25 |
---|---|
[C언어 백준 풀이][Bronze III] 부재중 전화, 공, 꼬리를 무는 숫자 나열, 생장점, 문어 숫자 (0) | 2021.08.24 |
[C언어 백준 풀이][Bronze III] 진수 변환, 정수를 문자열로 처리하여 푸는 문제 등 (0) | 2021.08.22 |
[C언어 백준 풀이][Bronze V] 사칙 연산 10문제 : 곱셈, 나머지, 평균값 응용 (0) | 2021.08.21 |
[C언어] 자연수 분할 : 2진수 응용 (백준 9095번 : 1, 2, 3 더하기 풀이) (0) | 2021.08.08 |