Problem Solving
[백준/C] 3052번 - 나머지
Jintiago
2022. 4. 25. 01:04
주어진 10개의 수를 42로 나눈 나머지 중 서로 다른 숫자의 개수를 세는 문제이다.
예전에 Java로도 풀어본 적이 있지만, C로 풀려고 정주행 중 문제를 다시 보니 어떻게 풀었는지 기억이 나지 않았다.
예전에 푼 것 참고해서 풀어도 되지만 다시 스스로 해보고 싶어서 고민해서 풀었다.
서로 다른 수가 몇 개 있는지 구하는 알고리즘을 어떻게 짤 것인가?
고민하다가, 먼저 나머지들을 크기 순으로 정렬하고 반복문으로 이전과 다른 수가 나올 때마다 count 변수에 1을 추가하는 식으로 풀면 되겠다고 생각했다.
#include <stdio.h>
int main(){
int nums[10], temp, count=1; // 변수 선언
// 입력 값을 빈 배열에 넣고 42로 나눈 나머지로 초기화
for(int i=0;i<10;i++){
scanf("%d", &nums[i]);
nums[i]%=42;
}
// 크기 순으로 정렬
for(int i=0;i<9;i++){
for(int j=i+1;j<10;j++){
if(nums[i]>nums[j]){
temp = nums[j];
nums[j] = nums[i];
nums[i] = temp;
}
}
}
// 정렬된 배열 내 요소를 차례로 돌며 다음 인덱스 값이 현재 값과 다를 경우 count 증가
for(int i=0;i<9;i++){
if(nums[i]!=nums[i+1])
count++;
}
printf("%d", count);
return 0;
}
예전에 Java로 어떻게 풀었는지 도무지 기억이 나지 않아 다시 찾아봤다. 과정은 다음과 같았다.
1. 42로 어떠한 수를 나눌 경우 나올 수 있는 나머지는 0~41이므로 길이 42의 배열을 만든다.
2. 10개의 수에 대해 각각을 나눈 나머지를 배열의 해당 인덱스에 대응하여 그 인덱스를 증가시킨다.
ex) 나머지가 41이면 인덱스 41번에 +1
3. 배열에서 0이 아닌 요소가 몇 개인지 센다.
같은 문제도 여러 방법으로 풀 수 있다는 게 정말 재미있다!