[백준] 1059번. 좋은 구간

leeeha·2024년 3월 15일
0

백준

목록 보기
155/186
post-thumbnail
post-custom-banner

문제

https://www.acmicpc.net/problem/1059


풀이

문제에 주어진 예시를 바탕으로 아래와 같이 일반화 된 식을 도출했는데, 예외적인 경우를 처리하지 않아서 오답을 받았다.

좋은 구간의 개수: (n - start) * (end - n + 1) + (end - n)

바로 집합의 첫번째 원소 x1부터 벌써 n보다 큰 경우에는, 다음과 같이 1로 시작점을 잡아줘야 한다!!

A, B는 양의 정수이므로 구간 시작점의 최솟값은 0이 아니라 1이다.

  • start = 1
  • end = x1 - 1
#include <iostream>
#include <string> 
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std;
typedef long long ll; 
typedef pair<int, int> pii; 

int L; 
set<int> s;
int n; 

void input() {
	cin >> L; 

	for(int i = 0; i < L; i++){
		int x; 
		cin >> x; 
		s.insert(x);
	}

	cin >> n; 
}

void solution() {
	int start = 0, end = 0;
	int ans = 0;
	
	// 집합 S에 속하지 않으면서, n은 포함하는 구간 체크  
	for(auto it = s.begin(); it != s.end(); it++){
		// 집합의 원소와 겹치면, 좋은 구간 만들 수 없음. 
		if(*it == n) {
			cout << "0\n";
			return;
		}
		else if(*it > n){
			end = *it - 1;
			
			// 첫번째 원소가 n보다 크면, 좋은 구간은 1부터 시작!! 
			if(it == s.begin()) start = 1;
			else start = *prev(it) + 1;
			
			break;
		}
	}

	cout << (n - start) * (end - n + 1) + (end - n);
}

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);

	input(); 
	
	solution(); 
	
	return 0;
}
profile
습관이 될 때까지 📝
post-custom-banner

0개의 댓글