[SW Expert Academy, SWEA 8898] 3차원 농부 (java)
Problem Solving/SWEA

[SW Expert Academy, SWEA 8898] 3차원 농부 (java)

728x90

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AW45TzHae8UDFAQ7&categoryId=AW45TzHae8UDFAQ7&categoryType=CODE&problemTitle=3%EC%B0%A8%EC%9B%90+%EB%86%8D%EB%B6%80&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1

 

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