새소식

코딩테스트/소프티어

[C++] 자동차 테스트

  • -

[문제]

Softeer

 

Softeer

연습문제를 담을 Set을 선택해주세요. 취소 확인

softeer.ai

[문제 풀이]

중앙값이라 해서 헷갈릴 수 있지만 문제를 천천히 읽어보면 하나도 어려울게 없는 문제이다.

배열에서 3개의 숫자를 골랐을때 지정한 숫자가 3개의 숫자의 중앙값 즉, 최소도 최대도 아닌값이기만 하면 되는 문제이다.

총 몇개가 나올 수 있냐가 해당 문제에 중요 포인트이고 이건 배열을 sort를 이용해 정렬할때 해당값의 앞에 있는 숫자 * 해당 값의 뒤에 있는 숫자가 답이 나온다.

 

문제에서 n은 5만이고 q는 20만이다. q의 값을 돌릴동안 n을 차례대로 모두 방문하면 시간초과가 나오기 쉽기 때문에 해당 문제를 해결하기 위해서 이진탐색을 응용하자.

[회고]

이진탐색을 생각안하고 단순히 방문했다가 시험에서 틀린 문제. 2개중 더 어려운건 풀었는데 이 문제를 틀려서 HSAT 시험을 통과 못했다....

진짜 너무 아쉽고 몹시 분하지만 분한만큼 문제를 더 잘 읽고 푸는 습관을 가지자.

[코드]

#include<iostream>
#include <vector>
#include <algorithm>

using namespace std;

int n,q;
vector<int> vec;

int binary(int car){
	int answer = 0;
	int start = 0;
	int end = n - 1;
	int mid = 0;
	while(start <= end){
		mid = (start + end) / 2;
		if(vec[mid] == car){
			answer = mid * (n - mid - 1 );
			break;
		}
		if(vec[mid] < car){
			start = mid + 1;
		}
		else if (vec[mid] > car){
			end = mid - 1;
		}
	}
	return answer;
}

int main(int argc, char** argv)
{
	cin>>n>>q;
	vec.resize(n);
	for(int i = 0;i<n;i++){
		cin>>vec[i];
	}
	sort(vec.begin(),vec.end());

	for(int i = 0;i<q;i++){
		int car;
		cin>>car;
		cout<<binary(car)<<endl;
	}

	return 0;
}

 

'코딩테스트 > 소프티어' 카테고리의 다른 글

[C++] 순서대로 방문하기  (0) 2023.08.25
[C++] 비밀 메뉴2  (0) 2023.01.16
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.