https://www.acmicpc.net/problem/3052
문제
두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다. 예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다.
수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.
입력
첫째 줄부터 열번째 줄 까지 숫자가 한 줄에 하나씩 주어진다. 이 숫자는 1,000보다 작거나 같고, 음이 아닌 정수이다.
출력
첫째 줄에, 42로 나누었을 때, 서로 다른 나머지가 몇 개 있는지 출력한다.
코드
using System;
class Program {
static void Main()
{
// 수 10개를 입력받고 42로 나눈 나머지를 저장합니다.
int maxCount = 10; //입력받을 수의 개수
int divNum = 42; //몇으로 나눌지
int[] remainder = new int[maxCount]; //나머지
for (int i = 0; i < maxCount; i ++ )
{
remainder[i] = int.Parse(Console.ReadLine()) % divNum;
}
bool[] isRemain = new bool[divNum];
//서로 다른 나머지가 몇 개 있는지 출력해야한다.
int count = 0;
for (int i = 0; i < maxCount; i++)
{
for(int j = 0; j < divNum; j++)
{
if (remainder[i] == j)
{
isRemain[j] = true;
}
}
}
for(int i = 0; i<isRemain.Length; i++)
{
if (isRemain[i]) count++;
}
Console.WriteLine(count);
}
}
막 이것저것 하다가 모르겠어서 검색을 했다. 42개의 bool 배열을 사용한다는 첫 줄을 읽자마자 "아하"를 외치고 돌아왔다.
42로 나누면 나머지는 항상 42미만이기 때문에 반복문을 돌면서 계산된나머지와 42미만의 수를 비교해서 카운트해야겠다까진 생각을 했는데, 어떻게 카운트할지 몰라서 고민중이었다. 여기서 막혀 어떻게 하지 고민하다가 결국 구글에 검색했는데... bool로 배열을 만들어서 사용한다는 첫 문장을 읽자마자 '오 이런방법이' 란 생각이 들었다. 얼마 안된 기간이지만 알고리즘 풀면서 bool을 배열로 이용한다는 생각을 한 번도 해본적이 없었다.
왜 이렇게 간단한걸 생각하지 못했나 자괴감들지만 앞으로 bool의 사용에 있어서도 더 넓게 생각해봐야겠다.
마지막으로 위 코드를 더 줄일수있어서 줄여보았다.
using System;
class Program {
static void Main()
{
// 수 10개를 입력받고 42로 나눈 나머지를 저장합니다.
int maxCount = 10; //입력받을 수의 개수
int divNum = 42; //몇으로 나눌지
int remainder = 0; //나머지
bool[] isRemain = new bool[divNum]; //나머지가 들어왔는지 여부판단
for (int i = 0; i < maxCount; i ++ )
{
remainder = int.Parse(Console.ReadLine()) % divNum;
isRemain[remainder] = true;
}
//isRemain의 true가 몇개인지 센다.
int count = 0;
for (int i = 0; i < isRemain.Length; i++)
{
if (isRemain[i]) count++;
}
Console.WriteLine(count);
}
}
42로 나눠서 나머지를 구한다 나머지는 항상 42 미만으로 나온다. remainder에 나머지를 담는다. 그리고 isRemain[remainder]에 true를 넣어줌으로서 어떤 나머지가 들어갔는지 확인한다. 나머지가 몇개 들어가던 상관없이 들어가기만 하면 true로 바뀌는것이기에 중복된 나머지를 걸러낼수있다.
아.. 이거 가지고 얼마나 고민한건지 한심하다.
콘솔실행화면
정상출력된다.