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

[C언어 백준 풀이][Bronze] Class 1+ 에센셜 10문제 풀이

restudy 2021. 11. 23. 13:40
반응형

이전 포스트에 이어서 Solved.ac의 Class 1+ 문제들에 수록되어 있는 Class 1 에센셜 문제들을 풀이해보도록 하겠습니다.

3문제씩 끊어서 포스팅하고 싶지만 그랬다가는 저품질에 걸릴 것 같아서 그냥 몰아서 10문제를 한 포스트에 풀이하도록 하겠습니다.

 

 

이 포스트에서 풀어볼 문제들의 목록은 위와 같습니다.

2739번 구구단, 2920번 음계, 8958번 OX퀴즈, 10818번 최소, 최대, 10869번 사칙연산, 10950번 A+B - 3, 10951번 A+B - 4, 10952번 A+B - 5, 11654번 아스키 코드, 11720번 숫자의 합 순서대로 풀이할 것입니다.

 

 

2739번 : 구구단

 

간단한 구구단 출력 문제로, 반복문을 이용하는 문제입니다.

입력으로 구구단 단수가 입력되면 해당 단수에 맞는 구구단을 출력해주면 되는 문제입니다.

 

#include<stdio.h>

int main() {
    int N;
    scanf("%d", &N);
    for(int i=1; i<=9; i++) printf("%d * %d = %d\n", N, i, N*i);
}

 

위와 같이 i에 대한 for문을 만들어서 N과 i의 곱을 출력하는 식을 만들어주면 됩니다.

단순 반복문 출력 문제이니 자세한 설명은 생략하겠습니다.

 

 

2920번 : 음계

 

8개의 정수가 입력되었을 때 1~8 순서대로 입력되었는지, 역순으로 입력되었는지, 아니면 둘 다 아닌지를 판별하는 문제입니다.

조건문에 사용되는 조건식에 따라 갈릴 수 있는 문제이지만, 어떻게 작성하든 상관은 없어보입니다.

 

#include<stdio.h>

int main() {
    int arr[10], ascending = 1, descending = 1;
    for(int i=1; i<=8; i++) {
        scanf("%d", &arr[i]);
        if(arr[i] != i) ascending = 0;
        if(arr[i] != 9-i) descending = 0;
    }
    if(ascending) printf("ascending");
    else if(descending) printf("descending");
    else printf("mixed");
}

 

여러 가지 방법이 있겠지만 저는 최대한 배열을 이용해 일반화시켜서 해결하는 방법을 선택했습니다.

for문을 이용해 i가 증가할 때마다 i와 동일하게 입력이 들어온다면 ascending이고, 9-i와 같이 들어온다면 descending임을 알 수 있습니다.

만약 둘 다 아니라면 mixed를 출력하도록 해주면 됩니다.

 

 

8958번 : OX퀴즈

 

입력되는 O와 X의 배열에 따라 점수를 계산하여 출력하는 문제입니다.

문제를 연속해서 맞을 경우 점수를 가중받기 때문에 이를 고려해서 점수를 계산해야 합니다.

예를 들어 OOO를 맞았다면 1+2+3 = 6점으로 계산해야 합니다.

 

#include<stdio.h>
#include<string.h>

int main() {
    int T, score, correct;
    char ox[100];
    scanf("%d", &T);
    for(int i=0; i<T; i++) {
        score = 0, correct = 0;
        scanf("%s", ox);
        for(int j=0; j<strlen(ox); j++) {
            if(ox[j] == 'O') score += ++correct;
            else correct = 0;
        }
        printf("%d\n", score);
    }
}

 

score와 correct라는 변수를 도입하였습니다.

score는 점수를 저장하는 변수, correct는 연속으로 맞은 문제의 수를 저장하는 변수입니다.

각 테스트케이스마다 score와 correct를 일단 0으로 초기화 해주고, 문자열을 입력받습니다.

이 때 문자열은 최대 80자이므로 배열을 넉넉하게 잡아주어야 합니다.

그 다음 각 문자열을 확인하며 O가 나올 때마다 correct를 1 더해주고 correct만큼 점수를 부여받습니다.

만약 틀릴 경우에는 correct를 0으로 초기화시켜줍니다.

마지막에 점수를 출력해주면 됩니다.

 

 

10818번 : 최소, 최대

 

N개의 정수가 주어질 때 최솟값과 최댓값을 출력하는 문제입니다.

이 때 정수의 개수가 100만개까지 입력이 되기 때문에 시간이 오래 걸리지 않도록 코드를 작성해야 합니다.

 

#include<stdio.h>

int main() {
    int N, digit, max = -1000000, min = 1000000;
    scanf("%d", &N);
    for(int i=0; i<N; i++) {
        scanf("%d", &digit);
        if(digit > max) max = digit;
        if(digit < min) min = digit;
    }
    printf("%d %d", min, max);
}

 

100만이나 되는 크기의 배열을 선언하면 메모리를 많이 잡아먹기 때문에 정수를 입력받은 자리에서 처리하는 방식을 선택했습니다.

입력받는 정수의 최댓값이 100만이고 최솟값이 -100만이므로, max를 -100만으로 잡고 min을 100만으로 잡은 뒤 비교해주면 모든 경우의 수를 반영할 수 있습니다.

조건문을 작성할 때 if와 else if가 아닌 둘 다 if로 작성해야 입력이 1개일 때 값이 반영됨에 주의해야 합니다.

 

 

10869번 : 사칙연산

 

두 자연수 A와 B를 입력받았을 때 사칙연산을 수행한 결과 + 나머지를 출력하는 문제입니다.

간단한 연산만 수행하면 되고 범위도 int 형을 벗어나지 않으므로 어렵지 않습니다.

 

#include<stdio.h>

int main() {
    int A, B;
    scanf("%d %d", &A, &B);
    printf("%d\n%d\n%d\n%d\n%d", A+B, A-B, A*B, A/B, A%B);
}

 

식을 여러 개 쓰지 않고 개행문자를 이용해 하나의 printf문으로 모두 출력할 수 있도록 구현하였습니다.

나눗셈이나 나머지의 경우에도 0으로 나누는 경우가 없으므로 주의하지 않아도 됩니다.

 

 

10950번 : A+B - 3

 

두 정수 A, B를 입력받앗을 때 A+B를 출력하는 문제입니다.

테스트케이스의 수만큼 입력을 받고 연산을 구현해야 된다는 점만 고려해주면 어려울 것이 없는 문제입니다.

 

#include<stdio.h>

int main() {
    int T, A, B;
    scanf("%d", &T);
    for(int i=0; i<T; i++) {
        scanf("%d %d", &A, &B);
        printf("%d\n", A+B);
    }
}

 

반복문 루프에 테스트케이스에 대한 수행 내용을 넣어주면 됩니다.

두 정수를 입력받아 덧셈을 출력하고 개행 문자만 출력해주면 됩니다.

 

 

10951번 : A+B - 4

 

위의 문제와 거의 비슷한데 테스트케이스의 수를 알려주지 않고 입력이 끝날 때까지 계속 반복문을 수행시켜야 하는 문제입니다.

이 문제의 경우 입력부를 무한 반복을 해야 하는지 또는 어떻게 해결해야 하는지 잘 모를수도 있습니다만, 저의 경우에는 다음과 같이 풀이했습니다.

 

#include<stdio.h>

int main() {
    int A, B;
    while(scanf("%d %d", &A, &B) != EOF) printf("%d\n", A+B);
}

 

채점 프로그램의 경우 프로그램 내에서 입력이 이루어지기 때문에 입력이 끝나면 EOF(End of File)이 전달됩니다.

따라서 while문의 조건문에서 scanf를 수행하고 이 결과값이 EOF이면 반복문이 종료되도록 설정해주면 됩니다.

 

 

10952번 : A+B - 5

 

이 문제 역시 위의 문제와 비슷하나, 테스트케이스의 수가 입력되지 않는다는 점과 대신 입력의 마지막에 0 두 개가 입력된다는 점이 특징입니다.

EOF를 사용하지 않고 0이 입력되었는지를 확인하면 되기 때문에 처리가 까다롭지는 않을 것입니다.

 

#include<stdio.h>

int main() {
    int A, B;
    while(1) {
        scanf("%d %d", &A, &B);
        if(!A && !B) return 0;
        printf("%d\n", A+B);
    }
}

 

저의 경우 while문의 조건에서 처리하기보다는 그냥 scanf를 먼저 수행하고 검사를 해서 0 0일 경우 return 0을 통해 프로그램이 즉시 종료되도록 작성하였습니다.

while문 조건에서 종료되도록 작성해도 됩니다.

 

 

11654번 : 아스키 코드

 

알파벳 소문자, 대문자, 정수 중 하나가 입력되었을 때 해당 문자의 아스키 코드를 출력하는 문제입니다.

이 문제의 경우 A나 a의 아스키 코드를 모르더라도 해결할 수 있습니다.

 

#include<stdio.h>

int main() {
    char c;
    scanf("%c", &c);
    printf("%d", c);
}

 

위와 같이 문자를 입력받는 형식은 %c로 입력받아, 출력할 때 %d 형태로 출력해주면 아스키 코드 값이 출력되게 됩니다.

 

 

11720번 : 숫자의 합

 

N개의 숫자가 공백없이 이어서 출력된다고 할 때 이 숫자들의 합을 구하는 문제입니다.

숫자들이 끊어지지 않기 때문에 입력을 직접 끊어서 받아야 된다는 어려움이 있지만 대신 모든 정수는 한 자리 수이기 때문에 끊어서 받는 법만 안다면 크게 어렵지는 않습니다.

 

#include<stdio.h>

int main() {
    int N, digit, sum = 0;
    scanf("%d", &N);
    for(int i=0; i<N; i++) {
        scanf("%1d", &digit);
        sum += digit;
    }
    printf("%d", sum);
}

 

이 문제의 핵심은 scanf 함수의 %1d 부분입니다.

%Nd로 입력받으면 N자리 정수만큼만 끊어서 입력을 받게 됩니다.

sum과 digit 변수를 선언하여 digit에 한 자리 정수를 저장하고, sum에 그 합들을 저장하도록 작성하였습니다.

 

 

결과

 

CLASS 1+의 에센셜 문제들을 모두 해결하여 CLASS 1을 달성하였습니다.

레이팅 때문에 반강제적으로 풀었지만 CLASS 2부터는 해결할만한 가치가 있는 문제들이 있으니 이어서 풀이해보도록 하겠습니다.

 

 

 

반응형