안경잡이 구루루

백준 3052 ( 나머지 ) [ C programming ] 본문

C언어(C programming)/문제풀이(백준,BaekJoon)

백준 3052 ( 나머지 ) [ C programming ]

구루루(gururu) 2020. 6. 30. 19:51
반응형

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


나:

#include <stdio.h>
int main() {
	int cnt = 0;
	int num[10];
	for (int i = 0; i < 10; i++) {
		scanf_s("%d", &num[i]);
		num[i] = num[i] % 42;
	}
	for (int j = 0; j < 10; j++) {
		for (int k = j + 1; k < 10; k++) {
			if (num[j] == -1)break;
			if (num[j] == num[k]) num[k] = -1;
		}
	}
	for (int i = 0; i < 10; i++) {
		if (num[i] != -1) cnt++;
	}
	printf("%d", cnt);
	
}

완성된 코드는 위와 같다.

 

#include <stdio.h>
int main() {
	int cnt = 0;
	int num[10];
	for (int i = 0; i < 10; i++) {
		scanf_s("%d", &num[i]);
		num[i] = num[i] % 42;

cnt는 서로다른 나머지 개수가 들어갈 변수로 0으로 초기화. 

문제에서 총 10개의 입력값을 받는다고 해서 반복을 사용하기 위해 배열을 이용해 int 자료형으로 선언했다. 그 이유는 char로 하니 비쥬얼 스튜디오에서는 크기 관련 오류가 떠서 int로 선언.

위의 for 반복문은 배열에 입력값을 받고 그 받은 값을 %42로 계산후 대입하는 과정이다.

 

	for (int j = 0; j < 10; j++) {
		for (int k = j + 1; k < 10; k++) {
			if (num[j] == -1)break;
			if (num[j] == num[k]) num[k] = -1;
		}
	}

위의 중첩 for 반복문은 서로다른 수인지 판별하기위해 반복을 통해 구별하는 과정이다.

즉, 비교를 통해 같은 값이 존재하면 위 문제에서는 입력하지 않을 음의 정수 -1로 대입해 모두 바꾼다.

이때 -1인 경우는 치환된 수로 입력값으로 존재하지 않는 수이기에 다른수와 비교할 수 없으니 이떄는 반복을 break

 

	for (int i = 0; i < 10; i++) {
		if (num[i] != -1) cnt++;
	}
	printf("%d", cnt);
	
}

위 for 반복문은 배열에 대입된 수를 출력하는 과정이다.

이때 -1인 수는 중복된 수가 치환된 것으로 서로다른 나머지 수에 포함되지 않기 때문에 개수에 포함되지 않는다.

이후 서로다른 수의 개수가 들어간 cnt를 출력하면 문제를 해결할 수 있다.

+) 서로다른 수를 구별하는 코드를 생각하느라 시간이 조금 걸렸다....


다른사람:

https://mjeong9316.tistory.com/123

#include <stdio.h>
#define num 42
int main() {
	int i, a, result = 0;
	int cnt[num] = { 0, };

	for (i = 0; i < 10; i++) {
		scanf("%d\n", &a);
		cnt[a % 42]++;
	}
	for (i = 0; i < num; i++) {
		if (cnt[i] != 0)result++;
	}
	printf("%d\n", result);
}

완성된 코드는 위와 같다.

 

#include <stdio.h>
#define num 42
int main() {
	int i, a, result = 0;
	int cnt[num] = { 0, };

	for (i = 0; i < 10; i++) {
		scanf("%d\n", &a);
		cnt[a % 42]++;

주목해야할 점은 총 42개의 cnt 배열을 만들어 활용한 점이다.  왜냐하면 42개가 나머지로 나눈 수로 나올 수 있는 수의 전부이기 때문이다.

42로 나누어 나올 수 있는 수들의 배열을 모두 만들고 42로 나눈 나머지 값과 배열의 위치를 동일시 시켜 나눈 나머지에해당하는 배열의 위치의 값을 1씩 증가 시킨다. 

위 과정을 for 반복문을 통해 그 결과값을 0으로 초기화된 배열의 위치의 값을 1 증가

 

	for (i = 0; i < num; i++) {
		if (cnt[i] != 0)result++;
	}
	printf("%d\n", result);
}

위 과정은 0이 아닌 값이 존재 할때 result를 1씩 증가시켜 서로다른 수의 개수를 세는 for 반복문이다.

즉 , 배열의 값이 0인 부분은 42로 나눈 나머지의 값이 존재하지 않는 부분으로 셀 필요업다. 그리고

서로 같은 값이 존재해 해당 배열의 값이 1이상이더라도 result로 1개 취급해서 개수를 세기 때문에 상관없다.

이후 최종 개수의 결과값이 담긴 result를 print해서 문제를 해결한다.

반응형