일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Implemention
- 파이썬
- 문제풀이
- 10807
- Baekjoon
- CSS
- 친절한 설명
- implement
- 문자열
- C Programming
- 구현
- HTML
- c언어
- VS
- 10926
- 그리디
- 초보
- C
- 정리
- Beakjoon
- 입문
- Python
- 심화1
- 코드엔진
- 백준
- 설명
- 알고리즘
- greedy
- 꾸준히
- C 언어
- Today
- Total
안경잡이 구루루
백준 3052 ( 나머지 ) [ C programming ] 본문
백준 3052 ( 나머지 ) [ C programming ]
구루루(gururu) 2020. 6. 30. 19:51https://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해서 문제를 해결한다.
'C언어(C programming) > 문제풀이(백준,BaekJoon)' 카테고리의 다른 글
백준 10926 (??!) [C programming] [VS / Visual Studio ] (0) | 2023.11.01 |
---|---|
백준 1546 ( 평균 ) [ C programming ] (0) | 2020.07.04 |
백준 2577 ( 숫자의 개수 ) (오답노트)[ C programming ] (0) | 2020.06.25 |
백준 10818 ( 최소 , 최대 ) [ C programming ] (0) | 2020.06.15 |
백준 2562 ( 최대값 ) [ C programming ] (0) | 2020.06.08 |