본문 바로가기

코딩/백준 BOJ

[백준/C언어] 3052번 - 나머지

백준 웹사이트 "3052번 - 나머지" 문제풀이입니다.

언어는 C언어입니다. (제출 언어: C99)

 


문제

 

3052번: 나머지

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

www.acmicpc.net


소스 코드

#include <stdio.h>
#include <string.h> //header file for 'memset'

int main(void){
    int remainders[42];
    memset(remainders, 0, sizeof remainders); //모든 값을 0으로 초기화

    for(int i=0; i<10; i++){
        int num;
        scanf("%d", &num);
        remainders[num%42] = remainders[num%42]+1;
    }

    int counter = 0;
    for(int j=0; j<42; j++){
        if(remainders[j] != 0)
            counter++;
    }
    printf("%d\n", counter);
}

문제 풀이

  이전 2577번 문제와 풀이가 비슷합니다. 2577번에서는 각 자리에 들어갈 수 있는 숫자가 총 10가지이므로 크기가 10인 배열을 만든 후, 해당되는 인덱스의 숫자가 나올 때마다 그 인덱스의 배열 요소에 반영했습니다. 이번 문제에서는 42로 나눈 나머지가 총 42가지이므로 크기가 42인 배열을 만든 후, 계산한 나머지에 해당하는 인덱스의 배열 요소에 반영합니다! 비슷하죠?

  크기가 42인 배열을 Line 5에서 만들고, Line 6에서 모든 값을 0으로 초기화합니다. 이때 사용한 'memset'은 조금 생소한 함수일 수도 있습니다. 여기서 memset을 이용하지 않고 for문을 이용해 초기화하는 방법도 있고, int remainders[42] = {0,0,0, ... ,0,0} 처럼 0을 42번 적는 방법도 있습니다. 하지만 memset을 이용하는 것이 가장 짧고 아름다워 보입니다. 'memset'은 'memory (메모리)'를 'set (설정)'하는 함수로, 배열 초기화 뿐만 아니라 메모리에 어떤 정보를 저장하고자 하면 언제든지 쓸 수 있는 함수입니다. 'remainders'라는 이름의 함수를 Line 5에서 선언하여 메모리에 공간을 확보하였기에, Line 6의 memset에서 'remainders'에 해당하는 공간에 0을 설정할 수 있습니다. 참고로 memset 함수는 <stdio.h>에 없고 <string.h>에 있으므로 Line 2와 같이 <string.h> 헤더 파일도 include 해주어야 합니다.

  Line 8 ~ 12는 10개의 입력값을 받고, 42로 나눈 나머지를 계산하여 해당하는 인덱스의 배열에 넣는 과정입니다. 2577번 문제 풀이 방법과 유사한 부분이죠.

  Line 14 ~ 19에서는 최종적으로 서로 다른 나머지의 개수를 확인합니다. 0 부터 41까지의 인덱스를 하나씩 확인해보며, 배열 값이 0이 아닐 경우 counter을 1씩 증가시킵니다. Line 19의 printf는 최종적인 counter의 값을 출력해줍니다. 

  아래는 백준 웹사이트 "2577번 - 숫자의 개수" 문제풀이 링크입니다.

 

[백준/C언어] 2577번 - 숫자의 개수

백준 웹사이트 "2577번 - 숫자의 개수" 문제풀이입니다. 언어는 C언어입니다. (제출 언어: C99) 문제 2577번: 숫자의 개수 첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 크

loding.tistory.com

 

반응형