코딩테스트/백준

[백준] 10430번 나머지

매과 2021. 3. 7. 04:42

문제

(A+B)%C는 ((A%C) + (B%C))%C 와 같을까?

(A×B)%C는 ((A%C) × (B%C))%C 와 같을까?

세 수 A, B, C가 주어졌을 때, 위의 네 가지 값을 구하는 프로그램을 작성하시오.

 

작성한 코드 c++

#include <iostream>
using namespace std;

int main(){
    int a,b,c;
    
    cin>>a>>b>>c;
    
    cout<<(a+b)%c<<endl;
    cout<<((a%c)+(b%c))%c<<endl;
    cout<<(a*b)%c<<endl;
    cout<<((a%c)*(b%c))%c<<endl;
     
}

결과

배운점

다른사람 코드를 보다가 나와 다른 점을 찾아봤다.

 

cin.tie(NULL);ios_base::/sync_with_stdio(false);를 추가하고 endl 대신 개행문자('\n')을 쓰면 입출력 속도를 늘릴 수 있다. 이 때 scanf/printf/puts/gets/getchar 등 C의 입출력 방식을 사용하면 안 된다.

 

C++로 알고리즘 문제를 풀 때 시간을 절약하기 위해 printf, scanf를 사용하는 경우가 많은데, 이 방법을 쓰면 그렇게 하지 않아도 된다. 위의 코드는 cout, cin의 성능을 printf, scanf만큼 빠르게 만들어주는 역할을 한다.

 

 

 

1. ios_base::/sync_with_stdio(false);

 

ios::/sync_with_stdio는 cpp의 iostream을 c의 stdio와 동기화시켜주는 역할을 한다.

이는 iostream, stdio의 버퍼를 모두 사용하기 때문에 딜레이가 발생한다.

ios::/sync_with_stdio(false)는 이 동기화 부분을 끊는 함수이다.

이를 사용하면 c++만의 독립적인 버퍼를 생성하게 되고 c의 버퍼들과는 병행하여 사용할 수 없게 된다.

대신 사용하는 버퍼의 수가 줄어들었기 때문에 속도는 높아지게 된다.

 

cin.tie(NULL)은 cin과 cout의 묶음을 풀어 준다. 기본적으로 cin으로 읽을 때 먼저 출력 버퍼를 비우는데, 마찬가지로 온라인 저지에서는 화면에 바로 보여지는 것이 중요하지 않다. 입력과 출력을 여러 번 번갈아서 반복해야 하는 경우 필수적이다.

 

2. cin.tie(NULL);

디폴트는 cout,cin이 tie되어 있다.

만약 cout << "hi"l; cin >> name; 이 순서라면 디폴트의 경우 "hi"가 먼저 출력되고 name을 입력할 것이다.

그러나 untie의 경우엔 cout으로부터cin을 untie해주기 때문에 먼저 입력부터 받게 된다.

그러나 "hi"는 보이지 않는데, cout은 디폴트에서는 출력명령을 내리거나 버퍼가 가득찼을 경우에만 flushed되고 출력되기 때문이다. 따라서 cin을 cout에서 untie하고 싶다면 cin으로 입력하기 전에 cout으로 출력을 할 때마다 지속적으로 flush를 해줘야 한다.

 

ios_base::/sync_with_stdio(false); 는 C와 C++의 버퍼를 분리한다. 이것을 사용하면 cin/cout이 더이상 stdin/stdout과 맞춰 줄 필요가 없으므로 속도가 빨라진다. 단, 버퍼가 분리되었으므로 cin과 scanf, gets, getchar 등을 같이 사용하면 안 되고, cout과 printf, puts, putchar 등을 같이 사용하면 안 된다.

 

 

참고사이트 : starrykss.tistory.com/750