문제 링크: https://www.boj.kr/1059 

 

1059번: 수2

첫째 줄에 Lucky Set에 포함된 숫자의 개수 L이 주어진다. 둘째 줄에는 L개의 수가 주어진다. 이 수는 1,000보다 작거나 같은 자연수이고, L은 50보다 작거나 같은 자연수이다. 그리고 중복되지 않는다

www.acmicpc.net

시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2초 128MB 3860 929 827 26.520%

문제

Lucky Set이란 정수의 집합이다.

구간 [A,B]란 A보다 크거나 같고, B보다 작거나 같은 모든 정수가 있는 구간이다. 이때, A와 B는 모두 양수이고, B는 A보다 크다.

구간 [A,B]가 Unlucky가 되기 위해선 구간에 속한 모든 정수가 Lucky Set에 없어야 한다.

Lucky Set과 N이 주어질 때, N을 포함하는 Unlucky 구간의 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 Lucky Set에 포함된 숫자의 개수 L이 주어진다. 둘째 줄에는 L개의 수가 주어진다. 이 수는 1,000보다 작거나 같은 자연수이고, L은 50보다 작거나 같은 자연수이다. 그리고 중복되지 않는다. 마지막 줄에는 N이 주어진다. N은 Lucky Set에서 가장 큰 수보다 작거나 같은 자연수이다.

출력

첫째 줄에 문제의 정답을 출력한다.

예제 입력 1

4
1 7 14 10
2

예제 출력 1

4

C++ code

#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;

int main(void)
{
	int n, left = 0, right, m;
    vector<int> Lucky;
    scanf("%d", &n);
    right = n - 1;
    
    for (int i = 0; i < n; i++)
    {
    	int temp;
        scanf("%d", &temp);
    }
    
    scanf("%d", &m);
    
    sort(Lucky.begin(), Lucky.end());
    
    while(left <= right)
    {
    	int mid = (left + right) / 2;
        
        if (Lucky[mid] < m)
        	left = mid + 1;
        else if (Lucky[mid] > m)
        	right = mid - 1;
        else
        {
        	printf("0");
            return 0;
        }
    }
    int temp = Lucky[left];
    left = Lucky[right];
    right = temp;
    
    printf("%d", (m - left - 1) * (right - m) + (right - m - 1));
    return 0;
}
반응형

'알고리즘 > 백준' 카테고리의 다른 글

1081 - 합  (0) 2020.11.05
1074 - Z  (0) 2020.11.03
1043 - 거짓말  (0) 2020.11.01
1038 - 감소하는 수  (0) 2020.10.31
1010 - 다리놓기  (0) 2020.10.30

+ Recent posts