백준 3052 ( 나머지 ) [ C programming ]
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해서 문제를 해결한다.