- 문제
N×N의 표에 수 N2개 채워져 있다. 채워진 수에는 한 가지 특징이 있는데, 모든 수는 자신의 한 칸 위에 있는 수보다 크다는 것이다. N=5일 때의 예를 보자.
12 7 9 15 5
13 8 11 19 6
21 10 26 31 16
48 14 28 35 25
52 20 32 41 49
이러한 표가 주어졌을 때, N번째 큰 수를 찾는 프로그램을 작성하시오. 표에 채워진 수는 모두 다르다.
//시간 제한: 1초, 메모리: 12MB
- 입력
첫째 줄에 N(1 ≤ N ≤ 1,500)이 주어진다. 다음 N개의 줄에는 각 줄마다 N개의 수가 주어진다. 표에 적힌 수는 -10억보다 크거나 같고, 10억보다 작거나 같은 정수이다.
- 출력
첫째 줄에 N번째 큰 수를 출력한다.
#include<iostream>
#include<algorithm>
#include<time.h>
using namespace std;
int n;
int arr[2250000]; //1500*1500
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
int m=n*n;
for(int i=0;i<m;i++){
cin>>arr[i];
}
sort(arr,arr+m);
cout<<arr[m-n];
return 0;
}
m=n*n번의 입력을 전부 arr배열에 넣고 오름차순 정렬 후 n번째로 큰 수를 출력 하기 위해
arr[m-n] 출력
처음 제출 했을 때 시간 초과가 발생 했었는데
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
이 세 줄 추가로 시간 초과를 해결할 수 있었다.
ios_base::sync_with_stdio 구문은 c의 stdio와 cpp의 iostream을 동기화시켜주는 역할을 하는데,
false해줌으로써 비활성화 시켜주는 것이다.
cin과 scanf or cout과 printf와 같이 c문법과 cpp문법을 함께 쓰지 못하게 되지만, 실행 속도 빨라짐
cin.tie(0);
cout.tie(0);
간단히 하면 cin과 cout의 묶음을 풀어주는 것
묶음을 풀게 되면서 cin과 cout 사이의 순서가 사라지지만 알고리즘에서는
화면에 먼저 보이는 것이 중요하지 않기 때문에 크게 상관X
실행 속도가 빨라진다.