테스트케이스가 별로 없어서 약간 해멘 문제이다. 실제로 틀리는 사람들 중에는 테이스케이스가 딱 하나 밖에 없어서 헷갈려 틀리는 경우가 대다수일거라고 생각된다.
입출력 예시
입력 |
출력 |
2 1 5 3 |
3 |
힌트) Lucky Set이 1, 5이고 N이 3인 경우 N을 포함하는 Unlucky 구간은 [2, 3]. [2, 4], [3, 4]로 3가지이다.
입력 |
출력 |
4 1 7 14 10 5 |
7 |
힌트) Lucky Set이 1, 7, 14, 10이고 N이 5인 경우 N을 포함하는 Unlucky 구간은 [2, 5], [2, 6], [3, 5], [3, 6], [4, 5], [4, 6], [5, 6]로 7가지이다.
정답 코드
#include <stdio.h> void sort(int *, int); int search_Unlucky(int *, int, int); int main() { int Lucky_Set[50]; int L; int N; int result; int i; scanf("%d", &L); for (i = 0; i < L; i++) { scanf("%d", Lucky_Set + i); } scanf("%d", &N); sort(Lucky_Set, L); result = search_Unlucky(Lucky_Set, L, N); printf("%d", result); return 0; } void sort(int *arr, int n) { int i, j; int tmp; for (i = 0; i < n - 1; i++) { for (j = i + 1; j < n; j++) { if (arr[i] > arr[j]) { tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } } } } int search_Unlucky(int *arr, int n, int N) { int i, j; int least = 1, large; int count = 0; for (i = 0; i < n; i++) { if (N <= arr[i]) { large = arr[i]; break; } least = arr[i] + 1; } for (i = least; i < large; i++) { for (j = i + 1; j < large; j++) { if (i <= N && N <= j) { count++; } } } return count; }
코드 설명
L을 입력 받고, Lucky Set의 정수들을 입력 받는다. Unlucky 구간을 찾을 때 편의성을 위해 배열을 정렬해주고, Unlucky 구간을 탐색한다. Unlucky 구간의 개수를 세는 방법은 다음과 같다.
1. least는 Unlucky 구간이 될 수 있는 최소의 정수, large는 최대의 정수이다. least는 1로 초기화한다.
2. 첫번째 for문에서는 large와 least를 갱신하는 작업을 한다. N보다 큰 Lucky Set의 정수가 나오면 large를 해당 정수로 교체하고 for문을 빠져나온다. 이 정수 이상의 숫자는 Unlucky 구간에 포함할 수 없기 때문이다. 만약 N보다 작은 정수라면 least를 해당 정수로 교체해준다.
3. 두번째는 2중 for문이다. Unlucky 구간의 개수를 세는 작업을 한다. i는 시작지점, j는 끝지점이다. 즉, 구간 [i, j]가 된다. 구간 [i, j]에 N이 포함되어있는지 검사하고, 포함되어 있으면 count를 1 증가시킨다.
4. count를 반환한다.
'BOJ' 카테고리의 다른 글
[C] 백준 1237번: 정ㅋ벅ㅋ (0) | 2018.07.22 |
---|---|
[C] 백준 10250번: ACM 호텔 (0) | 2018.07.19 |
[C] 백준 1371번: 가장 많은 글자 (0) | 2018.07.15 |