두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다. 예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다.
수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.
첫째 줄부터 열번째 줄 까지 숫자가 한 줄에 하나씩 주어진다. 이 숫자는 1,000보다 작거나 같고, 음이 아닌 정수이다.
첫째 줄에, 42로 나누었을 때, 서로 다른 나머지가 몇 개 있는지 출력한다.
#include <iostream>
#include <vector>
using namespace std;
#define MAX 10
#define DIVIDEVALUE 42
int main() {
int numbers[MAX];
vector<int> remainingValues;
for (int i = 0; i < MAX; i++)
{
// 수 10개 입력
cin >> numbers[i];
// 42로 나눈 나머지값을 저장
remainingValues.push_back(numbers[i] % DIVIDEVALUE);
}
// 나머지 값들이 서로 중복되지 않는지 검사한다.
int result = 0;
bool isOverlap = false;
for (int i = 0; i < remainingValues.size(); i++)
{
if (isOverlap == false) result++;
for (int k = i + 1; k < remainingValues.size(); k++)
{
isOverlap = remainingValues[i] == remainingValues[k];
if (isOverlap) break;
}
}
// 서로 중복되지 않는 다른 값의 개수를 출력
cout << result;
return 0;
}
간단한 문제였지만, 알고리즘 최적화와 조건문의 선행과 후행 결과에 대한 차이에 대해 고민하는 시간이 주어졌다.
서로 중복되지 않는 다른 값의 개수를 비교하기 위해서 굳이 비교한 것을 또 비교할 필요는 없으므로 두번째 for문의 초기값을 비교의 기준의 되는 값의 다음 값으로 설정하고 같은 수가 있으면 해당 for문을 break 키워드를 이용해서 for문을 종료시키는 방법을 사용했다.
다 풀고, 이 전 문제들을 보니 배열을 사용해보는 아주 기초적인 문제인데 너무 어렵게 푼 것 같다.. 그래서 다른 사람들의 코드를 보니 아주 단순하게 풀었다. 그래서 다시 작성해서 첨부한다
#include <iostream>
using namespace std;
#define MAX 10
int main()
{
int input;
int container[42] = { 0 }; // 배열의 모든 요소들의 값을 0으로 초기화한다.
int result = 0;
for (int i = 0; i < MAX; i++)
{
cin >> input;
container[input % 42]++;
}
for (int i = 0; i < 42; i++)
{
if (container[i] > 0) result++;
}
cout << result;
return 0;
}
42길이의 배열을 선언하고 입력 받은 값을 42로 나눈 나머지의 값을 인덱스로 사용해서 그 요소의 값을 증가시킨다.
그리고 다시 배열을 순회해서 증가된 데이터를 찾아 결과 값을 증가시키는 아주 간단한 해결이 있었다...
참고 자료 및 사이트 (감사합니다)