개발자/C or C++

[백준] 3052번

Mosser 2021. 10. 3.
728x90
반응형

문제

알고리즘

이전에 풀었던 2572번과 비슷한 유형의 문제입니다 (아래 링크 참조)

 

 

 

1. 우선은 문제의 입력 부분에서 각 입력받는 숫자는 1000보다 작거나 같은 음이 아닌 정수입니다.

즉 0~1000까지의 숫자가 입력값으로 들어갈 수 있습니다. 여기서 제가 든 생각은 입력값으로 들어오는 숫자를

42로 나눈 나머지의 값은 어찌 됐든 1000보다는 작거나 같을 것이라고 생각했습니다.

그렇기 때문에 서로 다른 나머지의 개수를 세기(2572번과 동일하게) 위해 배열의 사이즈를 1000으로 지정하고 0으로 초기화한 후, 시작하였습니다.

* 배열의 사이즈를 더 크게 잡아도 상관은 없습니다.

문제의 예시를 이용하자면, 대략 아래 표와 같은 형식입니다.

0 0 0 0 0 0 0 0
arr[39] arr[40] arr[41] arr[42] arr[43] arr[44] arr[82] arr[83]

원래 연속적으로 할당이 되어 있지만 설명을 위하여 위와 같이 서술하였습니다.

2. 숫자 10개를 입력받으면서 각각의 숫자를 42로 나눈 나머지 인덱스의 값을 +1 하는 방식으로 구현하였습니다.

3. 배열을 순회하면서 값이 0 이상인 경우는 무조건 count를 1증가하는 조건을 넣었습니다.

4. 출력!

 

#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;

int main(){
	vector<int> arr(1001);  //배열 1000 사이즈 선언
	int temp; //입력을 받기 위한 임시 값 선언
	int i=0; // 인덱스용 변수
	int count=0; // 서로 다른 나머지를 세기 위한 변수
	
// 10개를 연속으로 입력 받고 42로 나눈 나머지의 인덱스의 값을 하나씩 올리는 반복문
	for(i=0;i<10;i++){    
		scanf("%d",&temp);
		arr[temp%42]++;
	}

//반복문으로 배열 1000개를 순회하면서 0보다 큰 값일 때, count값을 증가하였다.
	for(i=0;i<1001;i++){
		if(arr[i]>0)
			count++;
	}

	printf("%d\n",count);
}

 

 

아래 코드는 제가 제일 처음에 풀었던 방식인데 설명하기가 어렵고 기억이 나지 않아서 일단 남겨두기만 합니다.

 

#include <iostream>
using namespace std;

int main(){
    int i,j;
    int count=0;
    int num[10];
    bool flag=false;
    for(i=0;i<10;i++){
        cin>>num[i];
        if(num[i]>1000 || num[i]<0)
            return 0;
            num[i]=num[i]%42;
        for(j=0;j<i;j++){
            if(num[i]==num[j]){
                flag=true;
                break;
            }else{
                flag=false;
                
            }


        }
        if(!flag){
            count++;
        }
        flag=false;


    }
    cout<<count<<endl;
}
반응형

'개발자 > C or C++' 카테고리의 다른 글

[백준] 10718번  (0) 2021.10.03
[백준] 2557번  (0) 2021.10.03
[백준] 2572번  (0) 2021.10.03
[백준] 2562번  (0) 2021.10.02
[백준] 10818번  (0) 2021.10.02

댓글