728x90
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
728x90
메모리: 188,668 KB, 시간: 2,281 ms
사용 알고리즘: 이분탐색
import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.*; public class Solution { public static void main(String[] args) throws Exception{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st; StringBuilder answer = new StringBuilder(); // T := 테스트 케이스의 수 int T = Integer.parseInt(br.readLine()); int N, M, dx, horse; int[] cow; for (int tc = 1; tc <= T; tc++) { // N := 소의 수, M := 말의 수 st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); M = Integer.parseInt(st.nextToken()); // dx := (소의 x좌표 - 말의 x좌표)의 절대값 st = new StringTokenizer(br.readLine()); dx = Math.abs(Integer.parseInt(st.nextToken()) - Integer.parseInt(st.nextToken())); // 소의 z좌표 cow = new int[N]; st = new StringTokenizer(br.readLine()); for (int i = 0; i < N; i++) { cow[i] = Integer.parseInt(st.nextToken()); } // 정렬 Arrays.sort(cow); // 말의 z좌표를 입력 받으며, 최소값이 나올 수 있는 가능성이 있는 소의 좌표를 찾는다. int result = Integer.MAX_VALUE, count = 0, idx; st = new StringTokenizer(br.readLine()); for (int i = 0; i < M; i++) { horse = Integer.parseInt(st.nextToken()); // 이분 탐색으로 horse보다 큰 좌표값 중 가장 작은 cow의 좌표 구하기 idx = binarySearch(horse, cow); if(result > Math.abs(horse - cow[idx])) { result = Math.abs(horse - cow[idx]); count = 1; } else if(result == Math.abs(horse - cow[idx])) count++; // horse보다 작은 좌표값 중 가장 큰 cow의 좌표가 있다면 if(idx != 0) { if(result > Math.abs(horse - cow[idx - 1])) { result = Math.abs(horse - cow[idx - 1]); count = 1; } else if(result == Math.abs(horse - cow[idx - 1])) count++; } } // 답 저장 answer.append("#" + tc + " " + (result + dx) + " " + count + "\n"); } System.out.println(answer); } static private int binarySearch(int num, int[] arr) { // 모든 arr에 대해서 num이 더 큰 경우 if(arr[arr.length - 1] < num) return arr.length - 1; // 모든 arr에 대해서 num이 더 작은 경우 if(arr[0] > num) return 0; // arr 중 num보다 큰 수 중 가장 작은 수 구하기 int s = 0, e = arr.length - 1, m; while(s <= e) { m = (s + e) / 2; if(arr[m] == num) return m; else if(arr[m] > num) e = m - 1; else s = m + 1; } return s; } }
728x90
'Problem Solving > SWEA' 카테고리의 다른 글
[SW Expert Academy, SWEA 7091] 은기의 아주 큰 그림 (java) (0) | 2024.02.04 |
---|---|
[SW Expert Academy, SWEA 1249] 보급로 (java) (0) | 2024.01.24 |
[SW Expert Academy, SWEA 10806] 수 만들기 (java) (0) | 2024.01.20 |
[SW Expert Academy, SWEA 1251] [응용문제] 하나로 (java) (0) | 2024.01.17 |
[SW Expert Academy, SWEA 1232] 사칙연산 (java) (0) | 2024.01.16 |