



시작점 2개를 먼저 큐에 넣고 시작합니다.
BFS를 사용할 때 큐에 쌓이는 순서는 반드시 거리순입니다.

dist 배열을 이용해 거리를 구하고 가장 긴 거리를 갖는 노드를 반환한다.
int binarySearch(int[] arr, int target){
int l = 0;
int h = arr.length;
while(h>l){
int mid = (l+h)/2;
if(arr[mid]==target){
return mid;
}else if(arr[mid]>target){
h = mid;
}else{
l = mid+1;
}
}
return -1;
}
int upperIdx(int target, int[] arr){
int l = 0;
int h = arr.length;
while(h>l){
int mid = (l+h)/2;
if(arr[mid]>target) h = mid;
else l = mid+1;
}
return l;
}

int lowerIdx(int target, int[] arr){
int l = 0;
int h = arr.length;
while(h>l){
int mid = (l+h)/2;
if(arr[mid]>=target) h = mid;
else l = mid+1;
}
return l;
}
각 배열의 값보다는 요소들의 대소 관계만 알고 싶을 때 크기순 인덱스로 붙여버린다.
private static int[] getArr() throws IOException{
return Arrays.stream(buffer.readLine().split("\\s+"))
.mapToInt(Integer::parseInt)
.toArray();
}
// 스트림을 사용하여 결과를 StringBuilder에 추가
String result = Arrays.stream(compressedPositions)
.mapToObj(String::valueOf)
.collect(Collectors.joining(" "));
int[] compressedPositions = IntStream.range(0, n)
.map(i -> Collections.binarySearch(uniquePositions, positions[i]))
.toArray();
private static long getAnswer(int[] costs, int limit){
long l = 0;
long h = Arrays.stream(costs).sum();
while(h>l){
long mid = (h+l)/2;
if(isValid(mid, costs, limit)){
h=mid;
}else{
l=mid+1;
}
}
return l;
}
private static long get(long[] lengths, long maxLength, long numOfOrder){
long l = 0;
long h = maxLength;
while(h>l){
long mid= (l+h+1)/2;
if(isValid(mid, numOfOrder, lengths)){
l=mid;
}else{
h=mid-1;
}
}
return l;
}
안에서 밖으로 이동하는 로직을 예시로 설명합니다.

방향의 사이클이 전부 완료 후 이동 횟수가 1씩 증가합니다.
⬆︎ ➡︎ 로 이동할 때는 1, 3, 5 ... 칸씩 이동하고,
⬇︎ ⬅︎ 로 이동할 때는 2, 4, 6 ... 칸씩 이동합니다.
밖에서 안으로 이동하는 경우 위와 반대로 생각하면 되므로 방향만 바꿔줍니다.
//상우하좌 순서대로 넣습니다.
int[] dx = {-1,0,1,0};
int[] dy = {0,1,0,-1};
int currentX = n/2;
int currentY = n/2;
int moveDir = 0;
int moveNum = 1;
while(currentX>0||currentY>0){
//하나의 방향 이동
for(int i=0; i<moveNum; i++){
//안에서 밖으로 이동하는 달팽이의 경우
//이동하는 도중 0,0으로 오게 되면 움직이는 것을 종료한다.
if(currentX==0&¤tY==0)break;
}
//방향을 전환합니다.
moveDir = (moveDir+1)%4;
//윗 방향 또는 아랫 방향이 될 때마다 움직여야할 횟수가 1증가합니다.
if(moveDir==0||moveDir==2) moveNum++;
}