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

[C언어 백준 풀이][Bronze II] 1075번 : 나누기 / 1076번 : 저항 / 1100번 : 하얀 칸

restudy 2021. 8. 25. 15:09
반응형

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입니다.

 

 

 

반응형