백준 1059번: 좋은구간 (JAVA)

SeungMin Park·2024년 1월 31일
1

알고리즘

목록 보기
4/9

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

백준 1059번 좋은 구간 문제이다
실버 4정도 되는 문제인데, 정답률이 너무 낮아서 풀어보았다


문제


풀이

우선 집합 S를 크기별로 정렬한다.
그럼 셋째줄에서 입력 받는 n이 집합 S에서 속하는 구역이 무조건 생긴다. 그 구역을 찾아 그 안에서 문제에 맞는 구간을 찾으면 된다.

이때, 경우의 수 3가지를 각각 고려하면 쉽게 풀 수 있는 문제이다.

1. 구역 내에서 n이 최대가 되는 구간
2. 구역 내에서 n이 최소가 되는 구간
3. 구역 내에서 n이 중간에 있는 구간

1번은 n보다 작은 구역의 수들을 세고,
2번은 n보다 큰 구역의 수들을 세고,
3번은 1번*2번 을 하여
이 세가지 숫자들을 더 해주면 된다


코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

import static java.util.stream.Collectors.counting;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int L = Integer.parseInt(br.readLine());
        String arr = br.readLine();
        int n = Integer.parseInt(br.readLine());

        StringTokenizer st = new StringTokenizer(arr);
        int [] array = new int[L+1];
        array[0] = 0;
        for(int i=1; i< array.length; i++){
            array[i] = Integer.parseInt(st.nextToken());
        }
        Arrays.sort(array);
        int start = 0;
        int end= 0;

        for(int i=1; i< array.length; i++){
            if(array[i] == n){
                System.out.print(0);
                return;
            } else if (n < array[i]) {
                start = array[i-1]+1;
                end = array[i]-1;
                break;
            }
        }

        System.out.print(counting(start, end, n));
    }

    private static int counting(int start, int end, int n) {
        int count = 0;

        count += n-start; // n이 최대일때 경우의 수
        count += end-n; // n이 최소일때 경우의 수
        count += (n-start)*(end-n); //n이 중간에 있을때 경우의 수

        return count;
    }
}

느낀 점

정답률이 낮길래 쫄았는데, 생각할 것도 별로 없고 금방 풀어서 시시했다

0개의 댓글

관련 채용 정보