coding_test/BAEKJOON

백준 3052번 C언어 풀이

CodeJin 2021. 8. 4. 18:36

https://www.acmicpc.net/problem/3052

 

3052번: 나머지

각 수를 42로 나눈 나머지는 39, 40, 41, 0, 1, 2, 40, 41, 0, 1이다. 서로 다른 값은 6개가 있다.

www.acmicpc.net

10개의 정수를 입력받아 42로 나눈 후 서로 다른 나머지의 개수를 세는 문제.

 

일단 나머지를 배열에 모두 입력한 후에, 같은 값이 있을 때, 한 개를 빼고 전부 -1로 바꿔버려 나머지를 셀 때 무시하도록 만들었다.

 

#include<stdio.h>

int main(){
    int num; // 입력받을 정수
    int cnt=0; // 서로 다른 나머지의 개수를 저장할 변수
    int rest[10]; // 나머지를 저장할 배열
    int i; // 반복문을 위한 인자

    for(i = 0; i < 10; i++){ //입력
        scanf("%d", &num);
        rest[i] = num % 42;
    }

    for(i = 0; i < 10; i++){ // 개수 세기
        if (rest[i] != -1) {
            cnt++; // cnt 1 증가
            for (int j = i+1; j < 10; j++){ 
                if (rest[i] == rest[j]){
                    rest[j] = -1; // 이후의 같은 값들을 -1로 만들어 무시하도록 한다.
                }
            }
        }
    }

    printf("%d", cnt);
    return 0;
}

조건적으로 이중반복문을 사용하게 되는데, 이중반복문을 쓰지 않고 풀 수 있을 것 같지만 필자는 잘 모르겠다. 나중에 좋은 아이디어가 생각나면 다시 풀어봐야겠다.

 

---------------------------------------20.08.16---------------------------------------

 

이중반복문이 필요하지 않다는 것을 깨달았다. 나머지 값을 배열의 위치로 사용하면 되는거였다.

#include<stdio.h>

int main(){
    int arr[42] = {0,};
    int n;
    int cnt=0;
    for (int i=0; i<10; i++) {
        scanf("%d", &n);
        arr[n%42]++;
    }
    for (int i = 0; i < 42; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    for (int i=0; i<42; i++) {
        if (arr[i] != 0) {
            cnt+=1;
        }
    }
    printf("%d", cnt);
    return 0;
}