코딩테스트 | (c++) 백준 3052번: 나머지

✅문제

두 자연수 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로 나눈 나머지의 값을 인덱스로 사용해서 그 요소의 값을 증가시킨다.
그리고 다시 배열을 순회해서 증가된 데이터를 찾아 결과 값을 증가시키는 아주 간단한 해결이 있었다...



참고 자료 및 사이트 (감사합니다)

좋은 웹페이지 즐겨찾기