본문 바로가기

백준 문제풀이 코드저장소/Silver

Baekjoon 4307. 개미 / Java

728x90

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

알고리즘 설명

문제 설명

개미들이 만나면 방향을 바꾸지만, 만났을 경우 서로 지나쳐간다라고 생각해도 논리가 같다.
라는 생각을 해내면 굉장히 쉬워지는 문제

코드 설명

개미의 현재 위치로부터 막대 양 끝으로 가는 시간을 구해서 최소시간, 최대시간을 구한다.

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

public class Main {
    public static int tc; // 테스트 케이스 수
    public static int n;  // 개미의 수
    public static int l;  // 막대의 길이
    public static int[] arr; // 각 개미의 초기 위치를 저장하는 배열

    public static BufferedReader br;
    public static StringTokenizer st; 

    public static void main(String[] args) throws IOException {
        br = new BufferedReader(new InputStreamReader(System.in)); // 표준 입력으로부터 입력을 받음
        st = new StringTokenizer(br.readLine()); // 첫 번째 줄에서 테스트 케이스 수를 읽음

        int tc = Integer.parseInt(st.nextToken()); 
        for (int t = 0; t < tc; t++) {
            st = new StringTokenizer(br.readLine());
            l = Integer.parseInt(st.nextToken()); // 막대의 길이
            n = Integer.parseInt(st.nextToken()); // 개미의 수

            arr = new int[n]; // 개미의 초기 위치를 저장할 배열
            for (int i = 0; i < n; i++) {
                st = new StringTokenizer(br.readLine()); // 각 개미의 초기 위치
                arr[i] = Integer.parseInt(st.nextToken()); // 개미의 위치
            }
            sol(n, l, arr); 
        }
    }

    public static void sol(int n, int l, int[] arr) {
        int minTime = 0; // 개미들이 가장 빨리 떨어지는 시간
        int maxTime = 0; // 개미들이 가장 늦게 떨어지는 시간

        for (int i = 0; i < n; i++) {
            // 각 개미가 양 끝으로 떨어지는 시간 중에서 최소 시간과 최대 시간을 계산
            int minTmpTime = Math.min(arr[i], l - arr[i]); // 왼쪽 끝이나 오른쪽 끝으로 가는 최소 시간
            int maxTmpTime = Math.max(arr[i], l - arr[i]); // 왼쪽 끝이나 오른쪽 끝으로 가는 최대 시간

            minTime = Math.max(minTmpTime, minTime); // 전체 개미 중에서 가장 빠른 시간 갱신
            maxTime = Math.max(maxTmpTime, maxTime); // 전체 개미 중에서 가장 늦은 시간 갱신
        }
        System.out.println(minTime + " " + maxTime); 
    }
}
반응형