NLP Learner in Switzerland

[C] 백준 단계별로 풀어보기 5단계 1차원 배열 7문제 본문

Algorithm in C/백준 알고리즘

[C] 백준 단계별로 풀어보기 5단계 1차원 배열 7문제

초코빵 2021. 4. 12. 10:00
728x90
반응형

* 문제번호를 클릭하면 해당 문제로 이동합니다(새창)

* VS code를 사용하고 있어서 scanf_s는 모두 scanf로 바꿔 제출했습니다.

 

 

 

10818 최소, 최대

#include <stdio.h>

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

- 1차원 배열문제니까 일단 배열부터 만들어서 시작을 했는데...

- 굳이 배열을 만들 필요가 없는 문제같아서 바꿨다. 찾아봐도 배열로 푼 사람은 없는거 같다. 왜 배열 문제일까?

 

 

 

2562 최댓값

#include <stdio.h>

int main() {
    int i;
    int array[9];
    int max = 0,index;
    for (i = 0; i < 9; i++) {
        scanf("%d", &array[i]);
        if (array[i] >= max) {
            max = array[i];
            index = i;
        }
    }
    printf("%d\n%d", max,index+1);
}

- for문으로 배열의 원소를 차례대로 입력받을 수 있다.

 

 

 

2577 숫자의 갯수

#include <stdio.h>

int main() {
    int A, B, C;
    scanf("%d %d %d", &A, &B, &C);
    int D = A * B * C;
    int array[10] = { 0, };
    int i,num;
    while(D > 0){
        num = D % 10;
        array[num]++;
        D = D / 10;
    }
    for (i = 0; i < 10; i++) {
        printf("%d\n", array[i]);
    }
}

- 할줄 모르겠어서 답 찾아봤다.

- array 초기화할 때 명령어는 array[size] = { 0, };

- mod를 사용해서 계속 나머지를 구해주고, 10으로 나눠주면서 한자리씩 앞으로 땡긴다. 이런 방법이 있구나.

- 코드 진짜 초심자라 간단한 것도 쩔쩔매나보다.... 더 노력해야지

 

 

 

3052 나머지

#include <stdio.h>

int main() {
    int i,n;
    int array[43] = { 0, };
    for (i = 0; i < 10; i++) {
        scanf("%d", &n);
        array[n % 42]++;
    }
    int count = 0;
    for (i = 0; i < 43; i++) {
        if (array[i] != 0) {
            count++;
        }
    }
    printf("%d", count);
}

- 이것 또한 서로 다른 나머지 갯수 세는 부분에서 막혀서 못 풀었고 다른 분 솔루션을 참고했다.

- array를 size 10으로 설정해서 mod 계산해서 넣은 후에 갯수 세는 것보다,

- 최초에 array를 szie 42로 정해서 인덱스마다 해당 mod값의 갯수가 들어가도록 하는게 나는 더 이해하기 쉬웠다.

 

 

 

1546 평균

#include <stdio.h>

int main() {
    int N,i;
    scanf("%d", &N);
    double score[1001];
    int max = 0;
    for (i = 0; i < N; i++) {
        scanf("%lf", &score[i]);
        if (max < score[i]) {
            max = score[i];
        }
    }
    double sum = 0;
    for (i = 0; i < N; i++) {
        score[i] = (score[i] / max) * 100.0;
        sum += score[i];
    }
    printf("%lf", sum/N);
}

- 문제 자체는 크게 어렵지 않은데, 데이터타입 선언이 빡세다.

- 문제에 보면 결과값이 실수임을 알 수 있으므로 float / double 중에 선택해야 한다.

- float로 선언 후 결과값 돌려봤을 때 정답하고 다르게 나온 예제가 발생해서 double로 선언했다.

 

 

 

8958 OX퀴즈

#include <stdio.h>

int main() {
    int N, i, j;
    scanf("%d", &N);
    char array[81];
    for (i = 0; i < N; i++) {
        scanf("%s", array, sizeof(array));
        int score = 0, O = 1;
        for (j = 0; j < strlen(array); j++) {
            if (array[j] == 'O') {
                score += O;
                O++;
            }
            else {
                O = 1;
            }
        }
        printf("%d\n", score);
    }
}

- 총 2가지 문제가 있었다.

1. 문자열 여러개 입력받기 :

- char array[size] 선언하고 for문 돌려서 scanf로 입력받으면 되겠지?

- 근데 scanf 라인에서 '위치를 기록하는 동안 액세스 위반이 발생했습니다'라는 에러메시지 뜸

- 구글링해보고 scanf 맨 뒤에 sizeof(array)를 넣으니 해결되었다.

2. 입력받은 문자열의 길이 len 계산 :

- strlen함수를 사용하려고 string.h 라이브러리를 선언했는데 오류는 아니지만 경고메시지가 뜸.

- array문자열이 0으로 종료되지 않을 수 있다면서...

- 이건 신기하게도 string.h 라이브러리를 빼버리니 해결되었다. 이유는 모르겠다.

- 하지만 제출시에는 string.h 라이브러리를 넣어주지 않으면 컴파일에러가 난다.

 

 

 

4344 평균은 넘겠지

#include <stdio.h>

int main() {
    int C;
    scanf("%d", &C);
    int i, j;
    for (i = 0; i < C; i++) {
        int numStudent, sumScore = 0, count = 0;
        scanf("%d", &numStudent);
        int score[1001];
        for (j = 0; j < numStudent; j++) {
            scanf("%d", &score[j]);
            sumScore += score[j];
        }
        double avgScore;
        avgScore = sumScore / numStudent;
        for (j = 0; j < numStudent; j++) {
            if (score[j] > avgScore) {
                count++;
            }
        }
        printf("%.3f%%\n", (double)count/numStudent*100);
    }
}

- 문제가 어렵진 않은데 또 data type 때문에 고생했다.

- 문제 내에 테스트 케이스 C는 정수, 학생 수 정수, 점수는 정수라고 다 주어져있고,

- 출력값은 소수점 3자리를 가진 실수로 출력하도록 되어있다.

- 그래서 평균 점수와 출력값을 double로 하니 해결되었다.

 

 

 

 

Comments