[C언어 백준 풀이][Bronze II] 1075번 : 나누기 / 1076번 : 저항 / 1100번 : 하얀 칸
1075번 : 나누기
정수 N의 가장 낮은 두 자리(십의 자리와 일의 자리)를 바꿔서 N을 F로 나누어떨어지게 하는 가장 작은 두 자릿수를 출력하는 문제입니다.
예를 들어 1000과 5를 입력받으면 뒤의 두 자릿수가 00일 때 가장 먼저 나누어 떨어지므로 답으로 00을 출력해야 합니다.
F가 두 자릿수로 제한되어 있으므로 답이 없는 경우는 존재하지 않음을 알 수 있으며, 문제 조건에서도 답이 없는 경우는 다루지 않았습니다.
#include<stdio.h>
int main() {
int N, F;
scanf("%d %d", &N, &F);
N /= 100;
N *= 100;
for(int i=0; i<100; i++)
if((N+i)%F == 0) {
printf("%02d", i);
return 0;
}
}
풀이는 위와 같습니다.
돌려볼 경우의 수가 100가지밖에 되지 않으므로 단순히 반복문을 돌려 100가지 경우를 확인해보고, 그 때의 i를 출력해주면 됩니다.
1076번 : 저항
위와 같이 저항에 표시되는 색과 각 색에 해당되는 저항값이 있을 때, 저항색 3개로 표시된 저항값을 계산하여 출력하는 문제입니다. (실제 저항도 이렇게 표시함)
저항에서는 앞의 두 색과 뒤의 색이 의미가 다른데, 앞의 두 색은 두 자리 자연수를 의미하고, 마지막 색은 곱해지는 숫자를 나타냅니다.
예를 들어 yellow, violet, red인 경우 yellow에 해당하는 4, violet에 해당하는 7이 47을 구성하고, 여기에 red에 해당하는 100을 곱한 4700을 출력해주면 됩니다.
#include<stdio.h>
#include<string.h>
int str_to_num(char str[]) {
if(!strcmp(str, "black")) return 0;
else if(!strcmp(str, "brown")) return 1;
else if(!strcmp(str, "red")) return 2;
else if(!strcmp(str, "orange")) return 3;
else if(!strcmp(str, "yellow")) return 4;
else if(!strcmp(str, "green")) return 5;
else if(!strcmp(str, "blue")) return 6;
else if(!strcmp(str, "violet")) return 7;
else if(!strcmp(str, "grey")) return 8;
else if(!strcmp(str, "white")) return 9;
}
int str_to_mul(char str[]) {
if(!strcmp(str, "black")) return 1;
else if(!strcmp(str, "brown")) return 10;
else if(!strcmp(str, "red")) return 100;
else if(!strcmp(str, "orange")) return 1000;
else if(!strcmp(str, "yellow")) return 10000;
else if(!strcmp(str, "green")) return 100000;
else if(!strcmp(str, "blue")) return 1000000;
else if(!strcmp(str, "violet")) return 10000000;
else if(!strcmp(str, "grey")) return 100000000;
else if(!strcmp(str, "white")) return 1000000000;
}
int main() {
char a[10], b[10], c[10];
scanf("%s\n%s\n%s", a, b, c);
printf("%lld", (str_to_num(a)*10 + str_to_num(b))*(long long int)str_to_mul(c));
}
문제 난이도 자체는 매우 쉬우나 문자열 비교 함수를 두 개나 만들어야 한다는 것이 매우 번거로운 문제입니다.
우선 문자열 비교 함수는 strcmp이며, <string.h>를 선언해야 사용할 수 있습니다.
strcmp(str1, str2)를 했을 때 사전순으로 비교하여 str1이 먼저 올 경우 -1, str2가 먼저 올 경우 1, 같은 문자열일 경우 0을 반환합니다.
이를 이용하여 위와 같이 문자열 비교 및 반환 함수를 만들 수 있습니다.
그리고 이 문제에는 함정이 하나 있는데, white의 경우 10^9까지 리턴하기 때문에 저항값이 최대 99억으로 int형의 범위인 21억을 넘어가게 됩니다.
따라서 마지막에 출력할 때는 long long int를 사용하여 출력해주는 편이 좋습니다.
1100번 : 하얀 칸
8x8 크기의 체스판이 있을 때, 흰색 칸 위에 말이 몇 개 있는지 찾아서 출력하는 간단한 문제입니다.
이 때 가장 왼쪽 위 칸의 색을 흰색이라고 가정한다고 하였습니다.
#include<stdio.h>
int main() {
int n = 0;
char chess[10][10];
for(int i=0; i<8; i++) scanf("%s", chess[i]);
for(int i=0; i<8; i++)
for(int j=0; j<8; j++)
if((i+j)%2 == 0 && chess[i][j] == 'F') n++;
printf("%d", n);
}
2차원 배열과 좌표의 연산을 이용하면 간단하게 해결할 수 있는 문제입니다.
입력은 널 문자 등을 제외하고 64개의 문자로 고정이므로 chess라는 2차원 배열을 선언하여 8줄을 입력받은 뒤, 문자열들 중에서 흰색 칸(i+j가 짝수인 칸)이면서 F인 칸을 찾을 때마다 n++를 해주어 마지막에 n을 출력해주면 됩니다.
+ 참고로 검은색 칸의 일대일 대응 조건은 (i+j)%2 == 1입니다.