백준 약속

KIMYEONGJUN·2024년 11월 30일
0
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫째 줄에 N이 주어진다.
다음 N개의 줄에 Ai, Bi가 주어진다.

첫째 줄에 기다리는 시간의 합이 최소인 서로 다른 정수 T의 개수를 출력한다.

내가 이 문제를 보고 생각해본 부분

각 줄에서 약속 시간 Ai와 도착 시간 Bi를 읽어 arr[i]에 Ai - Bi를 저장한다.
이 과정은 문제의 핵심인 기다림 시간을 계산하기 위한 기초 단계를 형성한다.
T가 변화할 때, arr의 값이 정렬되면, 절반은 양수, 절반은 음수 범위에 있어야 한다. 
이는 T의 가능한 값이 arr의 중간 값을 기준으로 변화하기 때문이다.
N이 홀수일 때는 항상 가능한 T의 개수는 1이다. 
이는 중간값이 유일하게 존재하고, 그에 따라 T의 값이 고정되기 때문이다.
N이 짝수일 경우 두 개의 중간값이 존재합니다.
이 두 값의 차이를 통해 T의 가능한 범위를 결정한다.
arr의 중간 두 값이 모두 0인 경우, 양쪽 방향으로 탐색하여 0이 아닌 값을 찾는다.
이는 T의 범위를 정확히 계산하기 위한 과정이다.
bw.write를 사용하여 결과를 출력한다.

코드로 구현

package baekjoon.baekjoon_24;

import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;

// 백준 1183번 문제
public class Main854 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int N = Integer.parseInt(br.readLine()); // 마법사의 수 N 입력
        int[] arr = new int[N]; // 약속시간과 도착시간의 차이를 저장할 배열 arr

        for(int i = 0; i < N; i++) {  // 각 마법사의 약속시간 Ai와 도착시간 Bi를 입력받아 arr에 저장
            StringTokenizer st = new StringTokenizer(br.readLine());
            int Ai = Integer.parseInt(st.nextToken()); // 약속시간
            int Bi = Integer.parseInt(st.nextToken()); // 도착시간
            arr[i] = Ai - Bi; // Ai - Bi의 값을 arr에 저장
        }

        Arrays.sort(arr); // arr을 오름차순으로 정렬
        int half = N / 2 - 1; // 중간 인덱스 계산 (짝수일 경우 중간 두 값 중 첫 번째 인덱스)
        int temp = 0; // 탐색을 위한 임시 변수
        if(N % 2 == 1) { // N이 홀수인 경우
            bw.write('1'); // 가능한 T의 개수는 항상 1
        } else {
            // N이 짝수인 경우, 중간 두 값의 차이를 이용해 가능한 T의 개수 계산
            // arr[half - temp]와 arr[half + 1 + temp]가 모두 0일 때까지 탐색
            while(arr[half - temp] == 0 && arr[half + 1 + temp] == 0) {
                temp++; // temp를 증가시키며 탐색
            }
            bw.write(String.valueOf(arr[half + 1 + temp] - arr[half - temp] + 1)); // 가능한 T의 개수를 계산하여 출력
        }

        bw.flush();
        bw.close();
        br.close();
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글