일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 코드트리빵
- 조합
- 순서대로방문하기
- 왕실의기사대결
- dfs
- 소프티어
- Calibration
- 이진탐색
- DenseDepth
- 슈퍼컴퓨터클러스터
- 마이크로프로세서
- BFS
- 마법의숲탐색
- ARM
- 루돌프의반란
- 코드트리
- 토끼와 경주
- 삼성기출
- 구현
- 나무박멸
- 수영대회결승전
- DP
- ros
- 3Dreconstruction
- 포탑부수기
- 싸움땅
- 시뮬레이션
- ICER
- 백준
- ISER
Archives
- Today
- Total
from palette import colorful_colors
[Softeer] 자동차 테스트 with C++ (HSAT 7회 기출) 본문
https://softeer.ai/practice/6247
언어: C++, 시간: 406ms
이진탐색을 꼭 써야 시간초과가 안 나는문제!
핵심 풀이 방법:
1. 오름차순으로 정렬을 우선 때린다
2. 쿼리에서 주어진 mi에 따라 중앙값이 나오는 가짓수를 판단한다:
-> 주어진 n개의 수 중 가장 작거나 가장 큰 값이었을때: 절대 중앙값이 될 수 없다, 0
-> 중간에 있는 값이었을때: 경우의 수는 mi 보다 작은 숫자 개수 x mi보다 큰 숫자 개수
-> mi가 n개의 수 중 아무것도 아닐때: 0
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N, Q;
int startNum, endNum;
vector <int> vhicle;
int bs(int target){
int startNum = 0;
int endNum = vhicle.size()-1;
int mid;
while (startNum <= endNum){
mid = (startNum + endNum) / 2;
if (vhicle[mid] == target)
return mid;
else if (vhicle[mid] < target)
startNum = mid + 1;
else
endNum = mid -1;
}
return -1;
}
int main(int argc, char** argv)
{
// 입력
cin >> N >> Q;
int temp;
for(int i=0; i<N; i++){
cin >> temp;
vhicle.push_back(temp);
}
sort(vhicle.begin(), vhicle.end());
startNum = vhicle[0];
endNum = vhicle[vhicle.size()-1];
// 쿼리
int curQurry;
for(int i=0; i<Q; i++){
cin >> curQurry;
if (curQurry <= startNum || curQurry >= endNum){
cout << 0 << "\n";
}
else{
int idx = bs(curQurry);
int result;
if (idx == -1)
result = 0;
else
result = (idx) * (vhicle.size()-idx-1);
cout << result << "\n";
}
}
return 0;
}
'알고리즘 > 문제풀이' 카테고리의 다른 글
[코드트리] 루돌프의 반란 with C++ (삼성기출) (0) | 2024.04.03 |
---|---|
[Softeer] 출퇴근길 with C++(HSAT 6회 기출) (0) | 2024.04.01 |
[Softeer] 순서대로 방문하기 with C++ (HSAT 7회 기출) (0) | 2024.04.01 |
[백준] 15684 사다리조작 with C++ (삼성기출) (0) | 2024.04.01 |
[백준] 14502 연구소 with C++ (삼성기출) (0) | 2024.03.31 |