본문 바로가기
백준 알고리즘 코딩

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

by 1005_ 2025. 3. 19.

[ 문제 ]

두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다.

예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다. 

수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다.

그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.

 

 

[ 입력 ]

첫째 줄부터 열번째 줄 까지 숫자가 한 줄에 하나씩 주어진다. 이 숫자는 1,000보다 작거나 같고, 음이 아닌 정수이다.

 

[ 출력 ]

첫째 줄에, 42로 나누었을 때, 서로 다른 나머지가 몇 개 있는지 출력한다.

 

[ 작성한 코드 ]

 

#include <stdio.h>

int main(int argc, char *argv[])
{
   int a; //입력 받을 자연수
   int arr[10]; // 연산 후 나머지 값을 저장할 배열
   int answer = 0;
   for(int i = 0; i < 10; i++)
   {
       scanf("%d",&a);
       arr[i] = a % 42;
   }

    for(int i = 0; i < 10; i++)
    {
        int cnt = 0; //중복값 체크하기위한 변수

       for(int j = i + 1; j < 10; j++)
       {    
           if(arr[i] == arr[j])
           {
               cnt++;
           }
       }
       if(cnt == 0){
           answer++;
           }
    }
    printf("%d",answer);
    return 0;
}

 

수 10개를 입력받고 입력받은 수를 42로 나눈 나머지는 10개이니 배열의 값을 10으로 설정했다.

배열에 입력된 나머지값들을 비교할 때 만약 그 값이 중복이라면 cnt 변수의 값을 하나씩 증가시켰고

만약에 중복되지 않는다면 (cnt가 0이라면) answer 값을 증가시켰다.

 

우리가 구해야하는 결과값은 중복값이 아닌 중복이 아닌 값들의 개수여서 answer을 출력한다.

 

처음에 문제를 풀 떄 cnt 값을 main 함수 아래에 바로 선언을 했는데, 그렇게 되면 이중 for문을 수행할 때 cnt값이 초기화가 되지 않아 cnt == 0 이라는 조건 자체가 수행되지 않는다는걸 깨달았다.

따라서 이중 for문에 cnt = 0을 삽입해 i값이 증가할때마다 cnt가 초기화 될 수 있도록 만들었다.

 

 

알고리즘 분류

  • 수학
  • 사칙연산