Plite
전자오락 공방
Plite
전체 방문자
오늘
어제
  • 분류 전체보기 (274)
    • 프로젝트 (18)
      • 완성 프로젝트 (3)
      • 프로젝트 진행 내역 (15)
    • 공부 및 정리 (241)
      • 백준 코드 (222)
      • C++ (8)
      • DirectX (2)
      • Unreal Engine (6)
      • 프로그래밍 패턴 (3)
    • 기타 (12)
      • 기타 주저리 (10)
    • 게임과 취미 (1)
    • 대문 (1)

블로그 메뉴

  • 홈
  • 프로젝트
  • 취미, 일상
  • 백준 프로필

공지사항

  • [Read Me]
  • 제 블로그에 방문하신 것을 환영합니다.

인기 글

태그

  • 누적합
  • 투포인터
  • 큐
  • 조합론
  • 세그먼트 트리
  • 정렬
  • C++
  • 구현
  • 백트래킹
  • 최소 스패닝 트리
  • 우선순위큐
  • 이분탐색
  • KMP
  • 분할정복
  • 스택
  • 백준
  • UC++
  • 트리
  • 기하
  • 그래프
  • SCC
  • 트라이
  • 정수론
  • 브루트포스
  • LCA
  • 수학
  • 동적계획법
  • 문자열
  • 유니온 파인드
  • 위상 정렬

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Plite
공부 및 정리/백준 코드

[C++]백준 - 1059번 문제

[C++]백준 - 1059번 문제
공부 및 정리/백준 코드

[C++]백준 - 1059번 문제

2021. 11. 16. 16:23

1059번: 좋은 구간 (acmicpc.net)

 

1059번: 좋은 구간

[9, 10], [9, 11], [9, 12], [10, 11], [10, 12]

www.acmicpc.net

 

1059번 : 좋은 구간


정수 집합 S가 주어졌을때, 다음 조건을 만족하는 구간 [A, B]를 좋은 구간이라고 한다.

  • A와 B는 양의 정수이고, A < B를 만족한다.
  • A ≤ x ≤ B를 만족하는 모든 정수 x가 집합 S에 속하지 않는다.

집합 S와 n이 주어졌을 때, n을 포함하는 좋은 구간의 개수를 구해보자.

 

입력


첫째 줄에 집합 S의 크기 L이 주어진다. 둘째 줄에는 집합에 포함된 정수가 주어진다. 셋째 줄에는 n이 주어진다.

  • 1 ≤ L ≤ 50
  • 집합 S에는 중복되는 정수가 없다.
  • 집합 S에 포함된 모든 정수는 1보다 크거나 같고, 1,000보다 작거나 같다.
  • 1 ≤ n ≤ (집합 S에서 가장 큰 정수)

 

출력


첫째 줄에 n을 포함하는 좋은 구간의 개수를 출력한다.

 

 

 


 

생각해 볼 점


좋은 구간 구하는 방법

 

집합 S = {A, B}일 경우

 

1. 0 ~ A 사이  (따라서, N이 집합 S의 최소값보다 작으면 0~A 구간을 구해줘야 합니다.)

2. A ~ B 사이

 

* A ~ B 사이의 N을 포함한 좋은 구간 구하는 방법

 

좋은구간 [ S, E ]가 있다고 할 때

 

* A < S <= N

* N <= E < B

 

일 것이고, S의 갯수는 N - A, E의 갯수는 B - N이므로

 

(N - A) * (B - N)의 갯수만큼 좋은 구간이 있으며,

 

이 때, S = N, E = N인 구간은 없기 때문에 제거해주면

 

결국 (N - A) * (B - N) - 1만큼의 좋은 구간이 존재합니다.

 

코드


#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
	int S, N;
	scanf("%d", &S);

	int* arr = new int[S + 1];
	for (int i = 0; i < S; i++) scanf("%d", &arr[i]);
	scanf("%d", &N);

	arr[S] = 0;
	int result = 0;

	sort(arr, arr + S + 1);
	for (int i = 0; i < S; i++)
	{
		int A = arr[i];
		int B = arr[i + 1];

		if (A < N && N < B)
		{
			result = (N - A) * (B - N) - 1;
			break;
		}
	}
	printf("%d", result);

	delete[] arr;
	return 0;
}

 

그 외


 

저작자표시 (새창열림)

'공부 및 정리 > 백준 코드' 카테고리의 다른 글

[C++]백준 - 2482번 문제  (0) 2021.11.17
[C++]백준 - 1032번 문제  (0) 2021.11.17
[C++]백준 - 11004번 문제  (0) 2021.11.16
[C++]백준 - 2836번 문제  (0) 2021.11.15
[C++]백준 - 2170번 문제  (0) 2021.11.15
  • 1059번 : 좋은 구간
  • 입력
  • 출력
  • 생각해 볼 점
  • 코드
  • 그 외
'공부 및 정리/백준 코드' 카테고리의 다른 글
  • [C++]백준 - 2482번 문제
  • [C++]백준 - 1032번 문제
  • [C++]백준 - 11004번 문제
  • [C++]백준 - 2836번 문제
Plite
Plite
개발 일지, 게임 이야기 등을 적어두는 공간입니다.

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.