본문 바로가기

컴퓨터/백준 알고리즘

백준 알고리즘 3052번: 나머지 [C++]

문제 출처: www.acmicpc.net/problem/3052

 

3052번: 나머지

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

www.acmicpc.net

1. 코드

(실행)

2. 풀이

int a, arr[42] = { 0, }, cnt = 0;

for(int i = 0; i < 10; i++)
{
    cin >> a;

이 문제는 단계별로 풀기로 보면 1차원 배열과 관련이 깊다. 그래서 배열을 활용하여 풀어보겠다. 우선 10번의 입력을 받아야 한다. 그래서 반복문을 통해서 10번을 입력받는다.

for(int i = 0; i < 10; i++)
{
    cin >> a;
    arr[a % 42] = 1;
}

그리고 난 다음에 arr배열의 크기 42이다. 배열에 저장해야 할 것은 입력한 a의 값을 42로 나눈 값에 위치한 인덱스 값을 식별하는 키값이다. 예를 들어 1을 42로 나누었을 때 나머지는 1이다. 그리고 배열의 인덱스 값이 1인 위치의 배열에 1이라는 키값을 입력하여 인덱스 값이 1인 배열에 나머지가 있고, 나머지의 값은 1이구나라는 것을 알 수 있다.

조금 헷갈릴 수 있으니 한번 더 예시를 들어보겠다. 만약 42를 입력했다면 42로 나눈다면 나머지는 0이다. 그렇다면 배열의 인덱스 값이 0인 위치에 1을 저장한다. 그렇다면 배열의 값이 1인 값들 중 배열 인덱스 값이 0인 위치를 인식하고 0이 나머지라는 것을 인식할 수 있게 된다.

for(int i = 0; i < 42; i++)
    if (arr[i])
        cnt++;

그리고 난 다음 배열의 값이 1(참)이라면 cnt의 값을 1씩 증가시킨다. cnt의 값으로 현재 배열에 나머지들의 개수를 파악할 수 있다.

cout << cnt;

다 파악을 한 뒤에 cnt의 값을 출력하면 마무리된다.