반응형
https://www.acmicpc.net/problem/3052
3052번: 나머지
각 수를 42로 나눈 나머지는 39, 40, 41, 0, 1, 2, 40, 41, 0, 1이다. 서로 다른 값은 6개가 있다.
www.acmicpc.net
코드
#include <stdio.h>
int main() {
int a[10];
int count = 0;
for(int i = 0; i < 10; i++) {
scanf("%d",&a[i]);
a[i] %= 42;
}
for(int i = 0; i < 9; i++) {
for(int j = i + 1; j < 10; j++) {
if(a[i] == a[j] && a[i] != 42) { // a[i] != 42 조건을 넣어주지 않는다면 그냥 a[i] == a[j]한 것과 같게 중복 count가 되어서 넣었습니다.
count++;
a[j] = 42; // 42로 나눈 나머지는 42 미만일 것이므로 42라는 값을 넣어줌으로써 같았던 값은 배제시키려고 했습니다.
}
}
}
printf("%d",10 - count);
}
이 문제를 2일 간 고민했습니다.
☞ 풀이 전
크기가 10인 정수형 배열을 하나만 선언해도 나머지를 바로 넣어주면 되기 때문에 문제가 없다고 생각했습니다. 배열 안의 원소들 중 같은 수가 있다면 1씩 증가시켜 총 10개의 원소에서 빼주면 된다고 생각해 count를 0으로 초기화 해주었습니다.
☞ 왜?
이중 for문을 구성하여 각 원소의 값을 비교하되 값이 같을 시 count++;이라고 단순히 생각했었는데 같은 값이 3개 이상이라면 중복 count가 되었습니다. 중복을 어떻게 제거할까 고민하는 것이 관건이었습니다.
고민결과 42로 나눈다면 나머지는 42 미만이 될 것이므로 같은 값이 나왔을 때 원소의 크기가 큰 원소를 42로 초기화 시켜주고 count를 증가시키는 방법을 생각해냈습니다. 42로 초기화됨으로써 이 원소는 다른 원소와 절대 같아질 수 없기 때문입니다. 즉 같은 원소를 하나 발견했으니 이제 이 원소를 배제시키자는 생각이었습니다.
추가로 if조건식에 배열의 원소가 42인 것을 제외해야 중복 count가 되지 않습니다.
☞ 다른 사람의 코드
#include <stdio.h>
int main()
{
int arr[10]; //입력받은 10개의 수를 각각 42로 나눈 나머지를 저장할 배열 선언
int Different_remain = 0;
for (int i = 0; i <= 9; i++) {
scanf("%d", &arr[i]);
arr[i] = arr[i] % 42; // 입력 값들의 나머지
}
for (int j = 0; j <= 9; j++) {
int count = 0;
for (int k = j + 1; k <= 9; k++) {
if (arr[j] == arr[k]) {
++count;
}
}
if (count == 0) {
++Different_remain;
}
}
printf("%d", Different_remain);
return 0;
}
출처: https://abcdefgh123123.tistory.com/160 [꾸준함의 기록:티스토리]
정석적인 풀이는 없다고 하지만 출제자가 원한 풀이는 이것일지도 모르겠네요. 항상 0에 주목해서 생각하는 습관을 기르겠습니다.
반응형
'Baekjoon' 카테고리의 다른 글
[C] 백준 8958번 : OX퀴즈 (1) | 2022.09.08 |
---|---|
[C] 백준 1546번 : 평균 (0) | 2022.08.16 |
[C] 백준 2439번 : 별 찍기 - 2 (0) | 2022.08.13 |
[C] 백준 15552번 : 빠른 A+B (0) | 2022.08.12 |
[C] 백준 2480번 : 주사위 세개 (0) | 2022.08.11 |