백준 - 3052번 나머지(배열)

Kiwoong Park·2023년 5월 7일
0

문제

두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다. 예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다.

수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.

출력
첫째 줄에, 42로 나누었을 때, 서로 다른 나머지가 몇 개 있는지 출력한다.

C++ 풀이

이중 for문을 통해 42로 나눈 나머지를 배열에 입력한 뒤 해당 나머지를 배열에 저장된 값이 있으면 전체 개수 cnt에서 하나 빼고, 같은 수가 없으면 cnt를 하나 더하는 로직

#include <iostream>
using namespace std;
int main(){
    int n,arr[10]={0},cnt=0;
    for(int i=0;i<10;i++){
        cin >> n;
        arr[i] = n%42;
        
        for(int j=0;j<i;j++){
            if(n%42==arr[j]) {
                cnt--;
                break;
            }
        }
        cnt++;
    }
    cout << cnt;
    
    
}

C++ 숏코딩 분석

#import<iostream>
int n,r[42],c;main(){for(;std::cin>>n;)r[n%42]++?c:++c;std::cout<<c;}

가독성을 위해 분해해보자

#import<iostream>
int n,r[42],c;	//나머지를 배열의 인덱스로 확인하는 로직으로 r 배열을 선언하면 모든 값이 0으로 초기화 된다.
main(){
	for(;std::cin>>n;) // 굳이 for loop로 할 필요가 없고 조건문만 확인하는거니 while로도 된다.
    	r[n%42]++?c:++c; // 삼항연산자를 이용하여 나머지를 인덱스로 하여 값을 1증가 시키기 전에, 
 // 인덱스에 없는 경우(즉, 0이어서 false 인경우) c값을 하나 증가, 
 // 이미 한번 저장되어 1이 아닌 경우(즉, true인 경우) c 값을 그대로 둔다.
	std::cout<<c;
}
profile
You matter, never give up

0개의 댓글